.gitignore | ||
check.sh | ||
configuration.nix | ||
flake.lock | ||
flake.nix | ||
hardware-configuration.nix | ||
README.md |
nixos-flake-example
This shows how to build the same config, with and without flakes. And shows that both builds produce the same output.
It also shows that flake.nix
is basically just some syntax. In this case,
we are using flakes to bring our NixOS system config (configuration.nix
and hardware-configuration.nix
)
into a single repository along with the nixpkgs
reference used to build the system. Without flakes,
nixpkgs
is ... well, potentially unknowable.
The point of flakes is to:
- remove
NIX_PATH
and all of the indirection that comes with it - encourages pinning by use/creation of
flake.lock
automatically with the use ofnix
commands - enables fully hermetic Nix projects were all dependencies are specified
- allow pure evaluation (again, enabling hermetic projects)
- pure evaluation allows for Nix expression caching, leading to nice UX performance gains
You can run ./check.sh
to show that this builds the same system config
with/without flakes.
flake fundamentals
Nix is in flakes mode when:
nixos-rebuild <cmd> --flake '.#'
is usednix build '.#something'
the hash-tag syntax is used
This automatically loads from a flake.nix
in the specified dir. See these examples:
These three examples, for me, are all the same source, but accessed in different ways:
-
nix build '.#nixosConfigurations.mysystem'
(loads
flake.nix
from.
(current dir)) -
nix build '/home/cole/code/nixos-flake-example#nixosConfigurations.mysystem'
(loads
flake.nix
from/home/cole/code/nixos-flake-example
) -
nix build 'github.com:colemickens/nixos-flake-example#nixosConfigurations.mysystem'
(nix will clone my github repo, then load
flake.nix
fromflake.nix
in the root of that repo checkout)
more tips
nixos-rebuild build --flake '.#'
will automatically try to find and build the attribute:.#nixosConfigurations.your_hostname
(assuming your machines hostname isyour_hostname
)
overview
The ./check.sh
script proves they give the same exact system toplevel outputs:
cole@slynux ~/code/nixos-flake-example master* 7s
❯ ./check.sh
:: Updating the 'nixpkgs' input in flake.nix
+ nix flake update --update-input nixpkgs
+ set +x
:: Using 'nixos-rebuild' to build the 'mysystem' toplevel
+ nixos-rebuild build --flake .#mysystem
warning: Git tree '/home/cole/code/nixos-flake-example' is dirty
building the system configuration...
warning: Git tree '/home/cole/code/nixos-flake-example' is dirty
+ set +x
:: Using rev=007126eef72271480cb7670e19e501a1ad2c1ff2 for <nixpkgs> (extracted from flake.nix)
:: Setting NIX_PATH to the same values flakes is using
+ NIX_PATH=nixpkgs=https://github.com/nixos/nixpkgs/archive/007126eef72271480cb7670e19e501a1ad2c1ff2.tar.gz:nixos-config=/home/cole/code/nixos-flake-example/configuration.nix
+ nix-build '<nixpkgs/nixos>' -A config.system.build.toplevel
/nix/store/gg1jhmzqndqa0rfnwfdbnzrn8f74ckr6-nixos-system-mysystem-21.03pre-git
+ set +x
flake: /nix/store/gg1jhmzqndqa0rfnwfdbnzrn8f74ckr6-nixos-system-mysystem-21.03pre-git
clssc: /nix/store/gg1jhmzqndqa0rfnwfdbnzrn8f74ckr6-nixos-system-mysystem-21.03pre-git