Flakes: Difference between revisions
 Improve translation support  | 
				 Marked this version for translation  | 
				||
| Line 12: | Line 12: | ||
* A [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html#description flake] refers to a file-system tree whose root directory contains the Nix file specification called <code>flake.nix</code>.  | * A [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html#description flake] refers to a file-system tree whose root directory contains the Nix file specification called <code>flake.nix</code>.  | ||
<!--T:141-->  | |||
* The contents of <code>flake.nix</code> file follow a uniform naming schema for declaring packages and their dependencies in the Nix language.  | * The contents of <code>flake.nix</code> file follow a uniform naming schema for declaring packages and their dependencies in the Nix language.  | ||
<!--T:142-->  | |||
*  Flakes introduce a [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references URL-like syntax] for specifying remote sources.  | *  Flakes introduce a [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references URL-like syntax] for specifying remote sources.  | ||
<!--T:143-->  | |||
* To simplify the long URL syntax with shorter names, [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html flakes uses a registry] of symbolic identifiers.  | * To simplify the long URL syntax with shorter names, [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html flakes uses a registry] of symbolic identifiers.  | ||
<!--T:144-->  | |||
* Flakes also allow for locking references and versions that can then be queried and updated programmatically.  | * Flakes also allow for locking references and versions that can then be queried and updated programmatically.  | ||
<!--T:145-->  | |||
* An [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html experimental command-line interface] accepts flake references for expressions that build, run, and deploy packages.  | * An [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html experimental command-line interface] accepts flake references for expressions that build, run, and deploy packages.  | ||
| Line 78: | Line 83: | ||
{{Warning | Since contents of flake files are copied to the world-readable Nix store folder, do not put any unencrypted secrets in flake files. You should instead use a [[Comparison of secret managing schemes|secret managing scheme]].}}  | {{Warning | Since contents of flake files are copied to the world-readable Nix store folder, do not put any unencrypted secrets in flake files. You should instead use a [[Comparison of secret managing schemes|secret managing scheme]].}}  | ||
<!--T:21-->  | ====Git WARNING==== <!--T:21-->  | ||
<!--T:146-->  | |||
For flakes in git repos, only files in the working tree will be copied to the store.  | For flakes in git repos, only files in the working tree will be copied to the store.  | ||
| Line 111: | Line 116: | ||
* <code>description</code> is a string describing the flake.  | * <code>description</code> is a string describing the flake.  | ||
<!--T:147-->  | |||
* <code>inputs</code> is an attribute set of all the dependencies of the flake. The schema is described below.  | * <code>inputs</code> is an attribute set of all the dependencies of the flake. The schema is described below.  | ||
<!--T:148-->  | |||
* <code>outputs</code> is a function of one argument that takes an attribute set of all the realized inputs, and outputs another attribute set whose schema is described below.  | * <code>outputs</code> is a function of one argument that takes an attribute set of all the realized inputs, and outputs another attribute set whose schema is described below.  | ||
<!--T:149-->  | |||
* <code>nixConfig</code> is an attribute set of values which reflect the [https://nixos.org/manual/nix/stable/command-ref/conf-file.html values given to nix.conf]. This can extend the normal behavior of a user's nix experience by adding flake-specific configuration, such as a binary cache.  | * <code>nixConfig</code> is an attribute set of values which reflect the [https://nixos.org/manual/nix/stable/command-ref/conf-file.html values given to nix.conf]. This can extend the normal behavior of a user's nix experience by adding flake-specific configuration, such as a binary cache.  | ||
| Line 122: | Line 130: | ||
[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-inputs The nix flake inputs manual].  | [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-inputs The nix flake inputs manual].  | ||
<!--T:150-->  | |||
[https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references The nix flake references manual].  | [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#flake-references The nix flake references manual].  | ||
| Line 166: | Line 175: | ||
<translate>  | <translate>  | ||
<!--T:42-->  | === Output schema === <!--T:42-->  | ||
<!--T:151-->  | |||
This is described in the nix package manager [https://github.com/NixOS/nix/blob/master/src/nix/flake-check.md src/nix/flake-check.md].  | This is described in the nix package manager [https://github.com/NixOS/nix/blob/master/src/nix/flake-check.md src/nix/flake-check.md].  | ||
| Line 180: | Line 189: | ||
* <code><system></code> is something like "x86_64-linux", "aarch64-linux", "i686-linux", "x86_64-darwin"  | * <code><system></code> is something like "x86_64-linux", "aarch64-linux", "i686-linux", "x86_64-darwin"  | ||
<!--T:152-->  | |||
* <code><name></code> is an attribute name like "hello".  | * <code><name></code> is an attribute name like "hello".  | ||
<!--T:153-->  | |||
* <code><flake></code> is a flake name like "nixpkgs".  | * <code><flake></code> is a flake name like "nixpkgs".  | ||
<!--T:154-->  | |||
* <code><store-path></code> is a <code>/nix/store..</code> path  | * <code><store-path></code> is a <code>/nix/store..</code> path  | ||
| Line 239: | Line 251: | ||
You can also define additional arbitrary attributes, but these are the outputs that Nix knows about.  | You can also define additional arbitrary attributes, but these are the outputs that Nix knows about.  | ||
<!--T:49-->  | ==== nix run ==== <!--T:49-->  | ||
<!--T:155-->  | |||
When output <code>apps.<system>.myapp</code> is not defined, <code>nix run myapp</code> runs <code><packages or legacyPackages.<system>.myapp>/bin/<myapp.meta.mainProgram or myapp.pname or myapp.name (the non-version part)></code>  | When output <code>apps.<system>.myapp</code> is not defined, <code>nix run myapp</code> runs <code><packages or legacyPackages.<system>.myapp>/bin/<myapp.meta.mainProgram or myapp.pname or myapp.name (the non-version part)></code>  | ||
| Line 309: | Line 321: | ||
* fetchurl and fetchtar [https://github.com/NixOS/nix/blob/36c4d6f59247826dde32ad2e6b5a9471a9a1c911/src/libexpr/primops/fetchTree.cc#L201 require] a sha256 argument to be considered pure.  | * fetchurl and fetchtar [https://github.com/NixOS/nix/blob/36c4d6f59247826dde32ad2e6b5a9471a9a1c911/src/libexpr/primops/fetchTree.cc#L201 require] a sha256 argument to be considered pure.  | ||
<!--T:156-->  | |||
* builtins.currentSystem is non-hermetic and impure. This can usually be avoided by passing the system (i.e., x86_64-linux) explicitly to derivations requiring it.  | * builtins.currentSystem is non-hermetic and impure. This can usually be avoided by passing the system (i.e., x86_64-linux) explicitly to derivations requiring it.  | ||
<!--T:157-->  | |||
* Imports from channels like <code><nixpkgs></code> can be made pure by instead importing from the <code>output</code> function in <code>flake.nix</code>, where the arguments provide the store path to the flake's inputs:  | * Imports from channels like <code><nixpkgs></code> can be made pure by instead importing from the <code>output</code> function in <code>flake.nix</code>, where the arguments provide the store path to the flake's inputs:  | ||
| Line 359: | Line 373: | ||
<translate>  | <translate>  | ||
<!--T:158-->  | |||
If you want to pass on the flake inputs to external configuration files, you can use the <code>specialArgs</code> attribute:  | If you want to pass on the flake inputs to external configuration files, you can use the <code>specialArgs</code> attribute:  | ||
| Line 377: | Line 392: | ||
<translate>  | <translate>  | ||
<!--T:159-->  | |||
Then, you can access the flake inputs from the file <code>configuration.nix</code> like this:  | Then, you can access the flake inputs from the file <code>configuration.nix</code> like this:  | ||
| Line 621: | Line 637: | ||
<translate>  | <translate>  | ||
<!--T:160-->  | |||
If the variable <code>nixpkgs</code> points to the flake, you can also define <code>pkgs</code> with overlays with:  | If the variable <code>nixpkgs</code> points to the flake, you can also define <code>pkgs</code> with overlays with:  | ||
| Line 709: | Line 726: | ||
Refer to [[Unfree software|Unfree Software]].  | Refer to [[Unfree software|Unfree Software]].  | ||
<!--T:131-->  | == Development tricks == <!--T:131-->  | ||
=== Build a package added in a PR ===  | === Build a package added in a PR === <!--T:161-->  | ||
</translate>  | </translate>  | ||
| Line 720: | Line 736: | ||
<translate>  | <translate>  | ||
<!--T:162-->  | |||
this allows building a package that has not yet been added to nixpkgs.  | this allows building a package that has not yet been added to nixpkgs.  | ||
| Line 731: | Line 748: | ||
<translate>  | <translate>  | ||
<!--T:163-->  | |||
this allows building a package that has not yet been added to nixpkgs.  | this allows building a package that has not yet been added to nixpkgs.  | ||
=== How to add a file locally in git but not include it in commits ===  | === How to add a file locally in git but not include it in commits === <!--T:164-->  | ||
<!--T:133-->  | <!--T:133-->  | ||
| Line 745: | Line 763: | ||
<translate>  | <translate>  | ||
=== Rapid iteration of a direct dependency === <!--T:135-->  | |||
=== Rapid iteration of a direct dependency ===  | |||
<!--T:165-->  | |||
One common pain point with using Nix as a development environment is the need to completely rebuild dependencies and re-enter the dev shell every time they are updated. The <code>nix develop --redirect <flake> <directory></code> command allows you to provide a mutable dependency to your shell as if it were built by Nix.  | One common pain point with using Nix as a development environment is the need to completely rebuild dependencies and re-enter the dev shell every time they are updated. The <code>nix develop --redirect <flake> <directory></code> command allows you to provide a mutable dependency to your shell as if it were built by Nix.  | ||
| Line 763: | Line 781: | ||
<translate>  | <translate>  | ||
<!--T:166-->  | |||
Now that you've built the dependency, <code>consumexe</code> can take it as an input. '''In another terminal''':  | Now that you've built the dependency, <code>consumexe</code> can take it as an input. '''In another terminal''':  | ||
| Line 774: | Line 793: | ||
<translate>  | <translate>  | ||
<!--T:167-->  | |||
If Nix warns you that your redirected flake isn't actually used as an input to the evaluated flake, try using the <code>--inputs-from .</code> flag. If all worked well you should be able to <code>buildPhase && installPhase</code> when the dependency changes and rebuild your consumer with the new version ''without'' exiting the development shell.  | If Nix warns you that your redirected flake isn't actually used as an input to the evaluated flake, try using the <code>--inputs-from .</code> flag. If all worked well you should be able to <code>buildPhase && installPhase</code> when the dependency changes and rebuild your consumer with the new version ''without'' exiting the development shell.  | ||
| Line 781: | Line 801: | ||
* [https://nix.dev/concepts/flakes Flakes] - nix.dev  | * [https://nix.dev/concepts/flakes Flakes] - nix.dev  | ||
<!--T:168-->  | |||
* [https://github.com/NixOS/rfcs/pull/49 RFC 49] (2019) - Original flakes specification  | * [https://github.com/NixOS/rfcs/pull/49 RFC 49] (2019) - Original flakes specification  | ||
<!--T:169-->  | |||
* [https://jade.fyi/blog/flakes-arent-real/ Flakes aren't real and can't hurt you] (Jade Lovelace, 2024)  | * [https://jade.fyi/blog/flakes-arent-real/ Flakes aren't real and can't hurt you] (Jade Lovelace, 2024)  | ||
<!--T:170-->  | |||
* [https://github.com/ryan4yin/nixos-and-flakes-book NixOS & Flakes Book](Ryan4yin, 2023) - 🛠️ ❤️ An unofficial NixOS & Flakes book for beginners.  | * [https://github.com/ryan4yin/nixos-and-flakes-book NixOS & Flakes Book](Ryan4yin, 2023) - 🛠️ ❤️ An unofficial NixOS & Flakes book for beginners.  | ||
<!--T:171-->  | |||
* [https://xeiaso.net/blog/nix-flakes-1-2022-02-21 Nix Flakes: an Introduction] (Xe Iaso, 2022)  | * [https://xeiaso.net/blog/nix-flakes-1-2022-02-21 Nix Flakes: an Introduction] (Xe Iaso, 2022)  | ||
<!--T:172-->  | |||
* [https://serokell.io/blog/practical-nix-flakes Practical Nix Flakes] (Alexander Bantyev, 2021) - Intro article on working with Nix and Flakes  | * [https://serokell.io/blog/practical-nix-flakes Practical Nix Flakes] (Alexander Bantyev, 2021) - Intro article on working with Nix and Flakes  | ||
<!--T:173-->  | |||
* [https://www.tweag.io/blog/2020-05-25-flakes/ Nix Flakes, Part 1: An introduction and tutorial] (Eelco Dolstra, 2020)  | * [https://www.tweag.io/blog/2020-05-25-flakes/ Nix Flakes, Part 1: An introduction and tutorial] (Eelco Dolstra, 2020)  | ||
<!--T:174-->  | |||
* [https://www.tweag.io/blog/2020-06-25-eval-cache/ Nix Flakes, Part 2: Evaluation caching] (Eelco Dolstra, 2020)  | * [https://www.tweag.io/blog/2020-06-25-eval-cache/ Nix Flakes, Part 2: Evaluation caching] (Eelco Dolstra, 2020)  | ||
<!--T:175-->  | |||
* [https://www.tweag.io/blog/2020-07-31-nixos-flakes/ Nix Flakes, Part 3: Managing NixOS systems] (Eelco Dolstra, 2020)  | * [https://www.tweag.io/blog/2020-07-31-nixos-flakes/ Nix Flakes, Part 3: Managing NixOS systems] (Eelco Dolstra, 2020)  | ||
<!--T:176-->  | |||
* [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html Nix flake command reference manual] - Many additional details about flakes, and their parts.  | * [https://nixos.org/manual/nix/unstable/command-ref/new-cli/nix3-flake.html Nix flake command reference manual] - Many additional details about flakes, and their parts.  | ||
<!--T:177-->  | |||
* [https://www.youtube.com/watch?v=QXUlhnhuRX4&list=PLgknCdxP89RcGPTjngfNR9WmBgvD_xW0l Nix flakes 101: Introduction to nix flakes] (Jörg Thalheim, 2020)  | * [https://www.youtube.com/watch?v=QXUlhnhuRX4&list=PLgknCdxP89RcGPTjngfNR9WmBgvD_xW0l Nix flakes 101: Introduction to nix flakes] (Jörg Thalheim, 2020)  | ||
<!--T:178-->  | |||
* [https://github.com/NixOS/nix/blob/master/src/nix/flake.md spec describing flake inputs in more detail]  | * [https://github.com/NixOS/nix/blob/master/src/nix/flake.md spec describing flake inputs in more detail]  | ||
<!--T:179-->  | |||
* [https://github.com/numtide/flake-utils flake-utils: Library to avoid some boiler-code when writing flakes]  | * [https://github.com/numtide/flake-utils flake-utils: Library to avoid some boiler-code when writing flakes]  | ||
<!--T:180-->  | |||
* [https://zimbatm.com/NixFlakes/#direnv-integration zimbat's direnv article]  | * [https://zimbatm.com/NixFlakes/#direnv-integration zimbat's direnv article]  | ||
<!--T:181-->  | |||
* [https://github.com/nix-community/todomvc-nix building Rust and Haskell flakes]  | * [https://github.com/nix-community/todomvc-nix building Rust and Haskell flakes]  | ||