wiki/_next/data/Ie9t5zutrXP6Of75Cb5xF/tools.nix.flakes.json
2022-07-29 15:41:17 +00:00

1 line
32 KiB
JSON

{"pageProps":{"metadata":{"date":"2021-07-18 22:34:11 +08:00","date_modified":"2022-05-22 21:24:01 +08:00","language":"en","source":""},"title":"Nix flakes","hast":{"type":"root","children":[{"type":"element","tagName":"nav","properties":{"className":"toc"},"children":[{"type":"element","tagName":"ol","properties":{"className":"toc-level toc-level-1"},"children":[{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"exploring-a-nix-flake"},"children":[{"type":"text","value":"Exploring a Nix flake"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#exploring-a-nix-flake"},"children":[{"type":"text","value":"Exploring a Nix flake"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"selected-list-of-attributes-for-outputs"},"children":[{"type":"text","value":"Selected list of attributes for outputs"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#selected-list-of-attributes-for-outputs"},"children":[{"type":"text","value":"Selected list of attributes for outputs"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"flake-templates"},"children":[{"type":"text","value":"Flake templates"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#flake-templates"},"children":[{"type":"text","value":"Flake templates"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"nix-registry"},"children":[{"type":"text","value":"Nix registry"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#nix-registry"},"children":[{"type":"text","value":"Nix registry"}]}]},{"type":"element","tagName":"li","data":{"hookArgs":[{"type":"element","tagName":"h1","properties":{"id":"more-information-about-flakes"},"children":[{"type":"text","value":"More information about flakes"}]}]},"properties":{"className":"toc-item toc-item-h1"},"children":[{"type":"element","tagName":"a","properties":{"className":"toc-link toc-link-h1","href":"/tools.nix.flakes#more-information-about-flakes"},"children":[{"type":"text","value":"More information about flakes"}]}]}]}]},{"type":"element","tagName":"div","properties":{"className":["special-block","block-note"]},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"As of 2021-06-30, the version used for this note is at v2.3 so it needs to be invoked with the unstable version.\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"What are Nix flakes?\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A self-contained Nix module that takes inputs (can be from other flakes) and create outputs.\nIt is comparable to "},{"type":"element","tagName":"a","properties":{"href":"https://guix.gnu.org/manual/en/html_node/Channels.html"},"children":[{"type":"text","value":"Guix channels"}]},{"type":"text","value":" (or the NUR) in the way any arbitrary value can be exported, thus extending a Nix module in any direction the author can make it to.\nAlso, it supercedes Nix channels as a way to manage your system.\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So, why use flakes?\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Since it is self-contained, it is easier to compose and develop environments for projects.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It is more declarative compared to Nix channels.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Provides a structure for discoverability through exploring the output.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In case you're using "},{"type":"element","tagName":"a","properties":{"href":"/linux.distros.nixos"},"children":[{"type":"text","value":"NixOS"}]},{"type":"text","value":", it also provides an easier way to extend it with third-party custom modules.\n"}]}]}]},{"type":"element","tagName":"h1","properties":{"id":"exploring-a-nix-flake"},"children":[{"type":"text","value":"Exploring a Nix flake"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To get started with a flake, you can quickly create one with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix flake init"}]},{"type":"text","value":".\nThis will create "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"flake.nix"}]},{"type":"text","value":" which is also required for Nix to recognize the project as a flake.\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Here's the skeleton of a flake.\n"}]},{"type":"element","tagName":"pre","properties":{"className":["src-block"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-nix"]},"children":[{"type":"text","value":"{\n description = \"A basic flake.\";\n inputs = {};\n outputs = {};\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It is really just an attribute set that mainly deals with three attributes:\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"description"}]},{"type":"text","value":" which is self-descriptive enough to see what's it for. ;p\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"inputs"}]},{"type":"text","value":" which contains inputs (that are other flakes) to be used for...\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"...the "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"outputs"}]},{"type":"text","value":" which is a set or a function that returns an attribute set to be exported.\n"}]}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Here's a real example of a basic flake.\n"}]},{"type":"element","tagName":"pre","properties":{"className":["src-block"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-nix"]},"children":[{"type":"text","value":"{\n description = \"A basic flake with some real inputs this time.\";\n inputs = {\n nixpkgs.url = \"github:NixOS/nixpkgs\";\n\n home-manager.url = \"github:nix-community/home-manager\";\n home-manager.inputs.nixpkgs.follows = \"nixpkgs\";\n };\n outputs = attrs@{ self, nixpkgs, home-manager, ... }: {\n homeManagerConfiguration = import ./hmUsers;\n packages.x86_64-linux = {\n hello = nixpkgs.pkgs.hello;\n };\n };\n}\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The flake requires other flakes from the nixpkgs and home-manager as indicated from the URL.\nThis will get the latest revision of both inputs.\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This is not ideal as it will get the latest revisions every time it requests the inputs.\nWhile you can pin the version by adding more information (e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixpkgs.url = \"github:NixOS/nixpkgs/nixos-21.11\""}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"home-manager.url = \"github:nix-community/home-manager/781d25b315def05cd7ede3765226c54216f0b1fe\""}]},{"type":"text","value":"), this isn't really necessary for the most part as we have lockfiles to secure our dependencies version.\nThese lockfiles can be found at "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"flake.lock"}]},{"type":"text","value":" where complete metadata for the flakes are found.\n"}]},{"type":"element","tagName":"h1","properties":{"id":"selected-list-of-attributes-for-outputs"},"children":[{"type":"text","value":"Selected list of attributes for outputs"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"While you can export attributes of any type, there are common attributes you'll mostly see.\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"As an example, here's the flake of my NixOS configuration.\n"}]},{"type":"element","tagName":"pre","properties":{"className":["src-block"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-shell"]},"children":[{"type":"text","value":"nix flake show github:foo-dogsquared/nixos-config | nix run nixpkgs#gnused -- 's/\\x1b\\[[0-9;]*m//g'\n"}]}]},{"type":"element","tagName":"div","properties":{"className":["exampe"]},"children":[{"type":"text","value":"github:foo-dogsquared/nixos-config/12077bfc601e5465e343e590a830e8d3cb6a1a59\n├───devShells\n│ ├───aarch64-darwin\n│ │ ├───flatpak: development environment 'nix-shell'\n│ │ ├───hugo: development environment 'nix-shell'\n│ │ └───rust: development environment 'nix-shell'\n│ ├───aarch64-linux\n│ │ ├───flatpak: development environment 'nix-shell'\n│ │ ├───hugo: development environment 'nix-shell'\n│ │ └───rust: development environment 'nix-shell'\n│ ├───i686-linux\n│ │ ├───flatpak: development environment 'nix-shell'\n│ │ ├───hugo: development environment 'nix-shell'\n│ │ └───rust: development environment 'nix-shell'\n│ ├───x86_64-darwin\n│ │ ├───flatpak: development environment 'nix-shell'\n│ │ ├───hugo: development environment 'nix-shell'\n│ │ └───rust: development environment 'nix-shell'\n│ └───x86_64-linux\n│ ├───flatpak: development environment 'nix-shell'\n│ ├───hugo: development environment 'nix-shell'\n│ └───rust: development environment 'nix-shell'\n├───homeManagerConfigurations: unknown\n├───homeManagerModules: unknown\n├───lib: unknown\n├───nixosConfigurations\n│ └───ni: NixOS configuration\n├───nixosModules\n│ ├───agenix: NixOS module\n│ ├───archiving: NixOS module\n│ ├───desktop: NixOS module\n│ ├───dev: NixOS module\n│ ├───hardware-setup: NixOS module\n│ ├───themes: NixOS module\n│ └───users: NixOS module\n└───packages\n ├───aarch64-darwin\n │ ├───doggo: package 'doggo-0.4.1'\n │ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'\n │ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'\n │ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'\n │ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'\n │ ├───libcs50: package 'libcs50-10.1.1'\n │ ├───llama: package 'llama-1.0.2'\n │ ├───neo: package 'neo-0.6'\n │ ├───pop-launcher: package 'pop-launcher-1.1.0'\n │ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'\n │ ├───sioyek: package 'sioyek-1.0.0'\n │ └───tic-80: package 'tic-80-unstable-2021-12-18'\n ├───aarch64-linux\n │ ├───doggo: package 'doggo-0.4.1'\n │ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'\n │ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'\n │ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'\n │ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'\n │ ├───libcs50: package 'libcs50-10.1.1'\n │ ├───llama: package 'llama-1.0.2'\n │ ├───neo: package 'neo-0.6'\n │ ├───pop-launcher: package 'pop-launcher-1.1.0'\n │ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'\n │ ├───sioyek: package 'sioyek-1.0.0'\n │ └───tic-80: package 'tic-80-unstable-2021-12-18'\n ├───i686-linux\n │ ├───doggo: package 'doggo-0.4.1'\n │ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'\n │ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'\n │ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'\n │ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'\n │ ├───libcs50: package 'libcs50-10.1.1'\n │ ├───llama: package 'llama-1.0.2'\n │ ├───neo: package 'neo-0.6'\n │ ├───pop-launcher: package 'pop-launcher-1.1.0'\n │ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'\n │ ├───sioyek: package 'sioyek-1.0.0'\n │ └───tic-80: package 'tic-80-unstable-2021-12-18'\n ├───x86_64-darwin\n │ ├───doggo: package 'doggo-0.4.1'\n │ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'\n │ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'\n │ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'\n │ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'\n │ ├───libcs50: package 'libcs50-10.1.1'\n │ ├───llama: package 'llama-1.0.2'\n │ ├───neo: package 'neo-0.6'\n │ ├───pop-launcher: package 'pop-launcher-1.1.0'\n │ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'\n │ ├───sioyek: package 'sioyek-1.0.0'\n │ └───tic-80: package 'tic-80-unstable-2021-12-18'\n └───x86_64-linux\n ├───doggo: package 'doggo-0.4.1'\n ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'\n ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'\n ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'\n ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'\n ├───libcs50: package 'libcs50-10.1.1'\n ├───llama: package 'llama-1.0.2'\n ├───neo: package 'neo-0.6'\n ├───pop-launcher: package 'pop-launcher-1.1.0'\n ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'\n ├───sioyek: package 'sioyek-1.0.0'\n └───tic-80: package 'tic-80-unstable-2021-12-18'\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"defaultPackage.${system}.${package}"}]},{"type":"text","value":" (or "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"packages.${system}.${package}"}]},{"type":"text","value":") is mainly expected for packages.\n This allows for easy building — e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix build nixpkgs#hello"}]},{"type":"text","value":" will refer to "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"defaultPackage.${system}.hello"}]},{"type":"text","value":".\n Another command that expects this is "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix run ${PACKAGE}"}]},{"type":"text","value":" (e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix run nixpkgs#hello"}]},{"type":"text","value":").\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixosConfigurations.${host}"}]},{"type":"text","value":" is a NixOS host configuration.\n Each attribute contain a set similar to the traditional set from "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"/etc/nixos/configuration.nix"}]},{"type":"text","value":".\n This is very beneficial for quickly installing only with flakes — e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixos-install --flake github:foo-dogsquared/nixos-config#zilch"}]},{"type":"text","value":" will install with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixosConfigurations.zilch"}]},{"type":"text","value":".\n However, attributes should be created with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"lib.nixosSystem"}]},{"type":"text","value":" from "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixpkgs"}]},{"type":"text","value":" flake.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixosModules.${module}"}]},{"type":"text","value":" is a "},{"type":"element","tagName":"a","properties":{"href":"roam:NixOS modules"},"children":[{"type":"text","value":"roam:NixOS modules"}]},{"type":"text","value":", allowing you to extend NixOS further.\n These are expected to be similar NixOS modules from nixpkgs.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"templates.${name}"}]},{"type":"text","value":" is a template that has the attribute "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"path"}]},{"type":"text","value":" and "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"description"}]},{"type":"text","value":".\n See "},{"type":"element","tagName":"a","properties":{"href":"/Flake%20templates"},"children":[{"type":"text","value":"Flake templates"}]},{"type":"text","value":" for more details about how it's used.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"devShell.${system}"}]},{"type":"text","value":" is expected to be a derivation (mostly with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"mkShell"}]},{"type":"text","value":").\n This is the default development environment to be used.\n This is mostly expected for projects providing an easy way to bootstrap for development (e.g., with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix develop ${FLAKE}"}]},{"type":"text","value":").\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"devShells.${system}.${name}"}]},{"type":"text","value":" is an attribute set of derivations (mostly from "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"mkShell"}]},{"type":"text","value":").\n This is similar to "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"devShell"}]},{"type":"text","value":" except this is where "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix develop"}]},{"type":"text","value":" subcommand finds if an attribute name is given.\n"}]}]}]},{"type":"element","tagName":"h1","properties":{"id":"flake-templates"},"children":[{"type":"text","value":"Flake templates"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Flakes can have templates to get started with.\n They can be used with "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix flake init ${TEMPLATE}"}]},{"type":"text","value":".\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You can export it in your flakes through the "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"templates"}]},{"type":"text","value":" attribute.\n "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"templates"}]},{"type":"text","value":" is expected to be an attribute set with each attribute representing a template.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"By default, we have the "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"templates"}]},{"type":"text","value":" flake from the global registry pointed to "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/NixOS/templates"},"children":[{"type":"text","value":"NixOS/templates"}]},{"type":"text","value":" Git repo.\n"}]}]}]},{"type":"element","tagName":"h1","properties":{"id":"nix-registry"},"children":[{"type":"text","value":"Nix registry"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Per the Nix manual:\n"}]},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Flake registries are a convenience feature that allows you to refer to flakes using symbolic identifiers such as "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixpkgs"}]},{"type":"text","value":", rather than full URLs such as "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"git://github.com/NixOS/nixpkgs"}]},{"type":"text","value":".\n"}]}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Here's an example of the registry list with some overriden flakes such as the "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixpkgs"}]},{"type":"text","value":" flake following from my "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/foo-dogsquared/nixos-config"},"children":[{"type":"text","value":"NixOS configuration"}]},{"type":"text","value":".\n"}]},{"type":"element","tagName":"pre","properties":{"className":["src-block"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-shell"]},"children":[{"type":"text","value":"nix registry list\n"}]}]},{"type":"element","tagName":"div","properties":{"className":["exampe"]},"children":[{"type":"text","value":"system flake:agenix path:/nix/store/yka795vkb7ny5fnybf8dafbypcjfmi9n-source?lastModified=1638837456&narHash=sha256-WHLOxthAGx%2fwXw3QUa%2flFE3mr6cQtnXfFYZ0DNyYwt4=&rev=57806bf7e340f4cae705c91748d4fdf8519293a9\nsystem flake:config path:/nix/store/3nlagaj6748w4ffxx4vp5jss2k571f8i-source?lastModified=1640442672&narHash=sha256-Gkt2On9szrFlOo6QiYMOA90qTp4PICd7STHFhGA4bCs=\nsystem flake:home-manager path:/nix/store/ijh6v700kpssfyw44v4awbm2gmjx26qs-source?lastModified=1640296831&narHash=sha256-Mu32vTcfZru4VrvgnpvQKmwC4uY0oF3vnnC2o9SgnRU=&rev=f15b151ca1c4aea23515c241051d71f1b5cf97c8\nsystem flake:nixpkgs path:/nix/store/lgfhg4n6445yizgf0xjirb4bc4j86fr9-source?lastModified=1640269308&narHash=sha256-vBVwv3+kPrxbNyfo48cB5cc5%2f4tq5zlJGas%2fqw8XNBE=&rev=0c408a087b4751c887e463e3848512c12017be25\nglobal flake:agda github:agda/agda\nglobal flake:blender-bin github:edolstra/nix-warez?dir=blender\nglobal flake:dreampkgs github:nix-community/dreampkgs\nglobal flake:dwarffs github:edolstra/dwarffs\nglobal flake:fenix github:nix-community/fenix\nglobal flake:flake-utils github:flake-utils/numtide\nglobal flake:gemini github:nix-community/flake-gemini\nglobal flake:home-manager github:nix-community/home-manager\nglobal flake:hydra github:NixOS/hydra\nglobal flake:mach-nix github:DavHau/mach-nix\nglobal flake:nimble github:nix-community/flake-nimble\nglobal flake:nix github:NixOS/nix\nglobal flake:nixops github:NixOS/nixops\nglobal flake:nixos-hardware github:NixOS/nixos-hardware\nglobal flake:nixos-homepage github:NixOS/nixos-homepage/flake\nglobal flake:nur github:nix-community/NUR\nglobal flake:nixpkgs github:NixOS/nixpkgs/nixpkgs-unstable\nglobal flake:templates github:NixOS/templates\nglobal flake:patchelf github:NixOS/patchelf\nglobal flake:nix-serve github:edolstra/nix-serve\nglobal flake:nickel github:tweag/nickel\n"}]},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So how does a flake registry work?\n"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It is managed through "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix registry"}]},{"type":"text","value":" subcommand or set "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix.registry"}]},{"type":"text","value":" in your system configuration.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Registries are primarily written as JSON files in certain files (e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"$XDG_CONFIG_HOME/nix/registry"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"/etc/nix/registry.json"}]},{"type":"text","value":").\n For more information, see the "},{"type":"element","tagName":"a","properties":{"href":"https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html#registry-format"},"children":[{"type":"text","value":"registry format from the manual"}]},{"type":"text","value":".\n Unlike the traditional Nix channels, the inclusion of arbitrary files and their locations doesn't seem to affect the reproducibility since it is mostly used as a convenience feature after all.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The flakes from default registry are mostly getting the latest revisions of the flake per invocation so it is best practice to pin them (e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix registry pin"}]},{"type":"text","value":", through "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix.registry"}]},{"type":"text","value":" while setting the NixOS systems in "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"flake.nix"}]},{"type":"text","value":").\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There are primarily three registries to worry about: user, system, and global.\n"}]}]},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This is also the reason it downloads something why each time you invoke a Nix-related command (e.g., "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix search"}]},{"type":"text","value":", "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nix edit"}]},{"type":"text","value":").\n "}]}]}]},{"type":"element","tagName":"h1","properties":{"id":"more-information-about-flakes"},"children":[{"type":"text","value":"More information about flakes"}]},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We can modify our inputs.\n In the above example, we made "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"home-manager"}]},{"type":"text","value":" to use our version of "},{"type":"element","tagName":"code","properties":{"className":["inline-verbatim"]},"children":[{"type":"text","value":"nixpkgs"}]},{"type":"text","value":" which will make it easier to sync.\n"}]}]}]}]},"backlinks":[{"path":"/packages.nix","title":"Nix packages"},{"path":"/tools.nix","title":"Nix package manager"}]},"__N_SSG":true}