mirror of
https://github.com/foo-dogsquared/wiki.git
synced 2025-01-31 04:58:21 +00:00
218 lines
54 KiB
HTML
218 lines
54 KiB
HTML
|
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width"/><meta charSet="utf-8"/><title>Nix flakes</title><script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script><script id="MathJax-script" async="" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script><script type="text/x-mathjax-config">
|
||
|
MathJax = {
|
||
|
tex: {
|
||
|
inlineMath: [ ['$','$'], ['\(','\)'] ],
|
||
|
displayMath: [ ['$$','$$'], ['[',']'] ]
|
||
|
},
|
||
|
options = {
|
||
|
processHtmlClass = "math"
|
||
|
}
|
||
|
}
|
||
|
</script><meta name="next-head-count" content="6"/><link rel="preload" href="/wiki/_next/static/css/52fc2ba29703df73922c.css" as="style"/><link rel="stylesheet" href="/wiki/_next/static/css/52fc2ba29703df73922c.css" data-n-g=""/><noscript data-n-css=""></noscript><link rel="preload" href="/wiki/_next/static/chunks/main-ae4733327bd95c4ac325.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/webpack-50bee04d1dc61f8adf5b.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/framework.9d524150d48315f49e80.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/commons.0e1c3f9aa780c2dfe9f0.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/pages/_app-8e3d0c58a60ec788aa69.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/940643274e605e7596ecea1f2ff8d83317a3fb76.4841a16762f602a59f00.js" as="script"/><link rel="preload" href="/wiki/_next/static/chunks/pages/%5B%5B...slug%5D%5D-1aa198f87ede1cd0e1dc.js" as="script"/></head><body><div id="__next"><main><h1>Nix flakes</h1><section class="post-metadata"><span>Date: <!-- -->2021-07-18 22:34:11 +08:00</span><span>Date modified: <!-- -->2022-05-22 21:24:01 +08:00</span></section><nav class="toc"><ol class="toc-level toc-level-1"><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#exploring-a-nix-flake" class="toc-link toc-link-h1">Exploring a Nix flake</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#selected-list-of-attributes-for-outputs" class="toc-link toc-link-h1">Selected list of attributes for outputs</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#flake-templates" class="toc-link toc-link-h1">Flake templates</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#nix-registry" class="toc-link toc-link-h1">Nix registry</a></li><li class="toc-item toc-item-h1"><a href="/wiki/tools.nix.flakes#more-information-about-flakes" class="toc-link toc-link-h1">More information about flakes</a></li></ol></nav><div class="special-block block-note"><p>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.
|
||
|
</p></div><p>What are Nix flakes?
|
||
|
</p><p>A self-contained Nix module that takes inputs (can be from other flakes) and create outputs.
|
||
|
It is comparable to <a href="https://guix.gnu.org/manual/en/html_node/Channels.html">Guix channels</a> (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.
|
||
|
Also, it supercedes Nix channels as a way to manage your system.
|
||
|
</p><p>So, why use flakes?
|
||
|
</p><ul><li><p>Since it is self-contained, it is easier to compose and develop environments for projects.
|
||
|
</p></li><li><p>It is more declarative compared to Nix channels.
|
||
|
</p></li><li><p>Provides a structure for discoverability through exploring the output.
|
||
|
</p></li><li><p>In case you're using <a href="/wiki/linux.distros.nixos">NixOS</a>, it also provides an easier way to extend it with third-party custom modules.
|
||
|
</p></li></ul><h1 id="exploring-a-nix-flake">Exploring a Nix flake</h1><p>To get started with a flake, you can quickly create one with <code class="inline-verbatim">nix flake init</code>.
|
||
|
This will create <code class="inline-verbatim">flake.nix</code> which is also required for Nix to recognize the project as a flake.
|
||
|
</p><p>Here's the skeleton of a flake.
|
||
|
</p><pre class="src-block"><code class="language-nix">{
|
||
|
description = "A basic flake.";
|
||
|
inputs = {};
|
||
|
outputs = {};
|
||
|
}
|
||
|
</code></pre><p>It is really just an attribute set that mainly deals with three attributes:
|
||
|
</p><ul><li><p><code class="inline-verbatim">description</code> which is self-descriptive enough to see what's it for. ;p
|
||
|
</p></li><li><p><code class="inline-verbatim">inputs</code> which contains inputs (that are other flakes) to be used for...
|
||
|
</p></li><li><p>...the <code class="inline-verbatim">outputs</code> which is a set or a function that returns an attribute set to be exported.
|
||
|
</p></li></ul><p>Here's a real example of a basic flake.
|
||
|
</p><pre class="src-block"><code class="language-nix">{
|
||
|
description = "A basic flake with some real inputs this time.";
|
||
|
inputs = {
|
||
|
nixpkgs.url = "github:NixOS/nixpkgs";
|
||
|
|
||
|
home-manager.url = "github:nix-community/home-manager";
|
||
|
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||
|
};
|
||
|
outputs = attrs@{ self, nixpkgs, home-manager, ... }: {
|
||
|
homeManagerConfiguration = import ./hmUsers;
|
||
|
packages.x86_64-linux = {
|
||
|
hello = nixpkgs.pkgs.hello;
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
</code></pre><p>The flake requires other flakes from the nixpkgs and home-manager as indicated from the URL.
|
||
|
This will get the latest revision of both inputs.
|
||
|
</p><p>This is not ideal as it will get the latest revisions every time it requests the inputs.
|
||
|
While you can pin the version by adding more information (e.g., <code class="inline-verbatim">nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11"</code>, <code class="inline-verbatim">home-manager.url = "github:nix-community/home-manager/781d25b315def05cd7ede3765226c54216f0b1fe"</code>), this isn't really necessary for the most part as we have lockfiles to secure our dependencies version.
|
||
|
These lockfiles can be found at <code class="inline-verbatim">flake.lock</code> where complete metadata for the flakes are found.
|
||
|
</p><h1 id="selected-list-of-attributes-for-outputs">Selected list of attributes for outputs</h1><p>While you can export attributes of any type, there are common attributes you'll mostly see.
|
||
|
</p><p>As an example, here's the flake of my NixOS configuration.
|
||
|
</p><pre class="src-block"><code class="language-shell">nix flake show github:foo-dogsquared/nixos-config | nix run nixpkgs#gnused -- 's/\x1b\[[0-9;]*m//g'
|
||
|
</code></pre><div class="exampe">github:foo-dogsquared/nixos-config/12077bfc601e5465e343e590a830e8d3cb6a1a59
|
||
|
├───devShells
|
||
|
│ ├───aarch64-darwin
|
||
|
│ │ ├───flatpak: development environment 'nix-shell'
|
||
|
│ │ ├───hugo: development environment 'nix-shell'
|
||
|
│ │ └───rust: development environment 'nix-shell'
|
||
|
│ ├───aarch64-linux
|
||
|
│ │ ├───flatpak: development environment 'nix-shell'
|
||
|
│ │ ├───hugo: development environment 'nix-shell'
|
||
|
│ │ └───rust: development environment 'nix-shell'
|
||
|
│ ├───i686-linux
|
||
|
│ │ ├───flatpak: development environment 'nix-shell'
|
||
|
│ │ ├───hugo: development environment 'nix-shell'
|
||
|
│ │ └───rust: development environment 'nix-shell'
|
||
|
│ ├───x86_64-darwin
|
||
|
│ │ ├───flatpak: development environment 'nix-shell'
|
||
|
│ │ ├───hugo: development environment 'nix-shell'
|
||
|
│ │ └───rust: development environment 'nix-shell'
|
||
|
│ └───x86_64-linux
|
||
|
│ ├───flatpak: development environment 'nix-shell'
|
||
|
│ ├───hugo: development environment 'nix-shell'
|
||
|
│ └───rust: development environment 'nix-shell'
|
||
|
├───homeManagerConfigurations: unknown
|
||
|
├───homeManagerModules: unknown
|
||
|
├───lib: unknown
|
||
|
├───nixosConfigurations
|
||
|
│ └───ni: NixOS configuration
|
||
|
├───nixosModules
|
||
|
│ ├───agenix: NixOS module
|
||
|
│ ├───archiving: NixOS module
|
||
|
│ ├───desktop: NixOS module
|
||
|
│ ├───dev: NixOS module
|
||
|
│ ├───hardware-setup: NixOS module
|
||
|
│ ├───themes: NixOS module
|
||
|
│ └───users: NixOS module
|
||
|
└───packages
|
||
|
├───aarch64-darwin
|
||
|
│ ├───doggo: package 'doggo-0.4.1'
|
||
|
│ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'
|
||
|
│ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'
|
||
|
│ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'
|
||
|
│ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'
|
||
|
│ ├───libcs50: package 'libcs50-10.1.1'
|
||
|
│ ├───llama: package 'llama-1.0.2'
|
||
|
│ ├───neo: package 'neo-0.6'
|
||
|
│ ├───pop-launcher: package 'pop-launcher-1.1.0'
|
||
|
│ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'
|
||
|
│ ├───sioyek: package 'sioyek-1.0.0'
|
||
|
│ └───tic-80: package 'tic-80-unstable-2021-12-18'
|
||
|
├───aarch64-linux
|
||
|
│ ├───doggo: package 'doggo-0.4.1'
|
||
|
│ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'
|
||
|
│ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'
|
||
|
│ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'
|
||
|
│ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'
|
||
|
│ ├───libcs50: package 'libcs50-10.1.1'
|
||
|
│ ├───llama: package 'llama-1.0.2'
|
||
|
│ ├───neo: package 'neo-0.6'
|
||
|
│ ├───pop-launcher: package 'pop-launcher-1.1.0'
|
||
|
│ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'
|
||
|
│ ├───sioyek: package 'sioyek-1.0.0'
|
||
|
│ └───tic-80: package 'tic-80-unstable-2021-12-18'
|
||
|
├───i686-linux
|
||
|
│ ├───doggo: package 'doggo-0.4.1'
|
||
|
│ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'
|
||
|
│ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'
|
||
|
│ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'
|
||
|
│ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'
|
||
|
│ ├───libcs50: package 'libcs50-10.1.1'
|
||
|
│ ├───llama: package 'llama-1.0.2'
|
||
|
│ ├───neo: package 'neo-0.6'
|
||
|
│ ├───pop-launcher: package 'pop-launcher-1.1.0'
|
||
|
│ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'
|
||
|
│ ├───sioyek: package 'sioyek-1.0.0'
|
||
|
│ └───tic-80: package 'tic-80-unstable-2021-12-18'
|
||
|
├───x86_64-darwin
|
||
|
│ ├───doggo: package 'doggo-0.4.1'
|
||
|
│ ├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'
|
||
|
│ ├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'
|
||
|
│ ├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'
|
||
|
│ ├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'
|
||
|
│ ├───libcs50: package 'libcs50-10.1.1'
|
||
|
│ ├───llama: package 'llama-1.0.2'
|
||
|
│ ├───neo: package 'neo-0.6'
|
||
|
│ ├───pop-launcher: package 'pop-launcher-1.1.0'
|
||
|
│ ├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'
|
||
|
│ ├───sioyek: package 'sioyek-1.0.0'
|
||
|
│ └───tic-80: package 'tic-80-unstable-2021-12-18'
|
||
|
└───x86_64-linux
|
||
|
├───doggo: package 'doggo-0.4.1'
|
||
|
├───gnome-shell-extension-burn-my-windows: package 'gnome-shell-extension-burn-my-windows-2'
|
||
|
├───gnome-shell-extension-desktop-cube: package 'gnome-shell-extension-desktop-cube-5'
|
||
|
├───gnome-shell-extension-fly-pie: package 'gnome-shell-extension-fly-pie-12'
|
||
|
├───gnome-shell-extension-pop-shell: package 'gnome-shell-extension-pop-shell-unstable-2021-11-30'
|
||
|
├───libcs50: package 'libcs50-10.1.1'
|
||
|
├───llama: package 'llama-1.0.2'
|
||
|
├───neo: package 'neo-0.6'
|
||
|
├───pop-launcher: package 'pop-launcher-1.1.0'
|
||
|
├───pop-launcher-plugin-duckduckgo-bangs: package 'pop-launcher-plugin-duckduckgo-bangs-1.3.0'
|
||
|
├───sioyek: package 'sioyek-1.0.0'
|
||
|
└───tic-80: package 'tic-80-unstable-2021-12-18'
|
||
|
</div><ul><li><p><code class="inline-verbatim">defaultPackage.${system}.${package}</code> (or <code class="inline-verbatim">packages.${system}.${package}</code>) is mainly expected for packages.
|
||
|
This allows for easy building — e.g., <code class="inline-verbatim">nix build nixpkgs#hello</code> will refer to <code class="inline-verbatim">defaultPackage.${system}.hello</code>.
|
||
|
Another command that expects this is <code class="inline-verbatim">nix run ${PACKAGE}</code> (e.g., <code class="inline-verbatim">nix run nixpkgs#hello</code>).
|
||
|
</p></li><li><p><code class="inline-verbatim">nixosConfigurations.${host}</code> is a NixOS host configuration.
|
||
|
Each attribute contain a set similar to the traditional set from <code class="inline-verbatim">/etc/nixos/configuration.nix</code>.
|
||
|
This is very beneficial for quickly installing only with flakes — e.g., <code class="inline-verbatim">nixos-install --flake github:foo-dogsquared/nixos-config#zilch</code> will install with <code class="inline-verbatim">nixosConfigurations.zilch</code>.
|
||
|
However, attributes should be created with <code class="inline-verbatim">lib.nixosSystem</code> from <code class="inline-verbatim">nixpkgs</code> flake.
|
||
|
</p></li><li><p><code class="inline-verbatim">nixosModules.${module}</code> is a <a href="roam:NixOS modules">roam:NixOS modules</a>, allowing you to extend NixOS further.
|
||
|
These are expected to be similar NixOS modules from nixpkgs.
|
||
|
</p></li><li><p><code class="inline-verbatim">templates.${name}</code> is a template that has the attribute <code class="inline-verbatim">path</code> and <code class="inline-verbatim">description</code>.
|
||
|
See <a href="/wiki/Flake%20templates">Flake templates</a> for more details about how it's used.
|
||
|
</p></li><li><p><code class="inline-verbatim">devShell.${system}</code> is expected to be a derivation (mostly with <code class="inline-verbatim">mkShell</code>).
|
||
|
This is the default development environment to be used.
|
||
|
This is mostly expected for projects providing an easy way to bootstrap for development (e.g., with <code class="inline-verbatim">nix develop ${FLAKE}</code>).
|
||
|
</p></li><li><p><code class="inline-verbatim">devShells.${system}.${name}</code> is an attribute set of derivations (mostly from <code class="inline-verbatim">mkShell</code>).
|
||
|
This is similar to <code class="inline-verbatim">devShell</code> except this is where <code class="inline-verbatim">nix develop</code> subcommand finds if an attribute name is given.
|
||
|
</p></li></ul><h1 id="flake-templates">Flake templates</h1><ul><li><p>Flakes can have templates to get started with.
|
||
|
They can be used with <code class="inline-verbatim">nix flake init ${TEMPLATE}</code>.
|
||
|
</p></li><li><p>You can export it in your flakes through the <code class="inline-verbatim">templates</code> attribute.
|
||
|
<code class="inline-verbatim">templates</code> is expected to be an attribute set with each attribute representing a template.
|
||
|
</p></li><li><p>By default, we have the <code class="inline-verbatim">templates</code> flake from the global registry pointed to <a href="https://github.com/NixOS/templates">NixOS/templates</a> Git repo.
|
||
|
</p></li></ul><h1 id="nix-registry">Nix registry</h1><p>Per the Nix manual:
|
||
|
</p><blockquote><p>Flake registries are a convenience feature that allows you to refer to flakes using symbolic identifiers such as <code class="inline-verbatim">nixpkgs</code>, rather than full URLs such as <code class="inline-verbatim">git://github.com/NixOS/nixpkgs</code>.
|
||
|
</p></blockquote><p>Here's an example of the registry list with some overriden flakes such as the <code class="inline-verbatim">nixpkgs</code> flake following from my <a href="https://github.com/foo-dogsquared/nixos-config">NixOS configuration</a>.
|
||
|
</p><pre class="src-block"><code class="language-shell">nix registry list
|
||
|
</code></pre><div class="exampe">system flake:agenix path:/nix/store/yka795vkb7ny5fnybf8dafbypcjfmi9n-source?lastModified=1638837456&narHash=sha256-WHLOxthAGx%2fwXw3QUa%2flFE3mr6cQtnXfFYZ0DNyYwt4=&rev=57806bf7e340f4cae705c91748d4fdf8519293a9
|
||
|
system flake:config path:/nix/store/3nlagaj6748w4ffxx4vp5jss2k571f8i-source?lastModified=1640442672&narHash=sha256-Gkt2On9szrFlOo6QiYMOA90qTp4PICd7STHFhGA4bCs=
|
||
|
system flake:home-manager path:/nix/store/ijh6v700kpssfyw44v4awbm2gmjx26qs-source?lastModified=1640296831&narHash=sha256-Mu32vTcfZru4VrvgnpvQKmwC4uY0oF3vnnC2o9SgnRU=&rev=f15b151ca1c4aea23515c241051d71f1b5cf97c8
|
||
|
system flake:nixpkgs path:/nix/store/lgfhg4n6445yizgf0xjirb4bc4j86fr9-source?lastModified=1640269308&narHash=sha256-vBVwv3+kPrxbNyfo48cB5cc5%2f4tq5zlJGas%2fqw8XNBE=&rev=0c408a087b4751c887e463e3848512c12017be25
|
||
|
global flake:agda github:agda/agda
|
||
|
global flake:blender-bin github:edolstra/nix-warez?dir=blender
|
||
|
global flake:dreampkgs github:nix-community/dreampkgs
|
||
|
global flake:dwarffs github:edolstra/dwarffs
|
||
|
global flake:fenix github:nix-community/fenix
|
||
|
global flake:flake-utils github:flake-utils/numtide
|
||
|
global flake:gemini github:nix-community/flake-gemini
|
||
|
global flake:home-manager github:nix-community/home-manager
|
||
|
global flake:hydra github:NixOS/hydra
|
||
|
global flake:mach-nix github:DavHau/mach-nix
|
||
|
global flake:nimble github:nix-community/flake-nimble
|
||
|
global flake:nix github:NixOS/nix
|
||
|
global flake:nixops github:NixOS/nixops
|
||
|
global flake:nixos-hardware github:NixOS/nixos-hardware
|
||
|
global flake:nixos-homepage github:NixOS/nixos-homepage/flake
|
||
|
global flake:nur github:nix-community/NUR
|
||
|
global flake:nixpkgs github:NixOS/nixpkgs/nixpkgs-unstable
|
||
|
global flake:templates github:NixOS/templates
|
||
|
global flake:patchelf github:NixOS/patchelf
|
||
|
global flake:nix-serve github:edolstra/nix-serve
|
||
|
global flake:nickel github:tweag/nickel
|
||
|
</div><p>So how does a flake registry work?
|
||
|
</p><ul><li><p>It is managed through <code class="inline-verbatim">nix registry</code> subcommand or set <code class="inline-verbatim">nix.registry</code> in your system configuration.
|
||
|
</p></li><li><p>Registries are primarily written as JSON files in certain files (e.g., <code class="inline-verbatim">$XDG_CONFIG_HOME/nix/registry</code>, <code class="inline-verbatim">/etc/nix/registry.json</code>).
|
||
|
For more information, see the <a href="https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-registry.html#registry-format">registry format from the manual</a>.
|
||
|
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.
|
||
|
</p></li><li><p>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., <code class="inline-verbatim">nix registry pin</code>, through <code class="inline-verbatim">nix.registry</code> while setting the NixOS systems in <code class="inline-verbatim">flake.nix</code>).
|
||
|
</p></li><li><p>There are primarily three registries to worry about: user, system, and global.
|
||
|
</p></li><li><p>This is also the reason it downloads something why each time you invoke a Nix-related command (e.g., <code class="inline-verbatim">nix search</code>, <code class="inline-verbatim">nix edit</code>).
|
||
|
</p></li></ul><h1 id="more-information-about-flakes">More information about flakes</h1><ul><li><p>We can modify our inputs.
|
||
|
In the above example, we made <code class="inline-verbatim">home-manager</code> to use our version of <code class="inline-verbatim">nixpkgs</code> which will make it easier to sync.
|
||
|
</p></li></ul><section><h2>Backlinks</h2><ul><li><a href="/wiki/packages.nix">Nix packages</a></li><li><a href="/wiki/tools.nix">Nix package manager</a></li></ul></section></main></div><script id="__NEXT_DATA__" type="application/json">{"props":{"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":{},"child
|