Title: Make nix flakes commands using the same nixpkgs as NixOS does | |
Author: Solène | |
Date: 20 July 2022 | |
Tags: nixos linux nix | |
Description: This explains how to make the command nix shell | |
nixpkgs#foobar to reuse nixpkgs from your NixOS system to save time and | |
bandwidth | |
# Introduction | |
This article will explain how to make the flakes enabled nix commands | |
reusing the nixpkgs repository used as input to build your NixOS | |
system. This will regularly save you time and bandwidth. | |
# Flakes and registries | |
By default, nix commands using flakes such as nix shell or nix run are | |
pulling a tarball of the development version of nixpkgs. This is the | |
default value set in the nix registry for nixpkgs. | |
```shell | |
$ nix registry list | grep nixpkgs | |
global flake:nixpkgs github:NixOS/nixpkgs/nixpkgs-unstable | |
``` | |
Because of this, when you run a command, you are likely to download a | |
tarball of the nixpkgs repository including the latest commit every | |
time you use flakes, this is particularly annoying because the tarball | |
is currently around 30 MB. There is a simple way to automatically set | |
your registry to define the nixpkgs repository to the local archive | |
used by your NixOS configuration. | |
To your `flake.nix` file describing your system configuration, you | |
should have something similar to this: | |
```nix | |
inputs.nixpkgs.url = "nixpkgs/nixos-unstable"; | |
[...] | |
nixosConfiguration = { | |
my-computer =lib.nixosSystem { | |
specialArgs = { inherit inputs; }; | |
[...] | |
}; | |
}; | |
``` | |
Edit /etc/nixos/configuration.nix and make sure you have "inputs" | |
listed in the first line, such as: | |
```nix | |
{ lib, config, pkgs, inputs, ... }: | |
``` | |
```nix | |
nix.registry.nixpkgs.flake = inputs.nixpkgs; | |
``` | |
After this change, running a command such as "nix shell | |
nixpkgs#gnumake" will reuse the same nixpkgs from your nix store used | |
by NixOS, otherwise it would have been fetching the latest archive from | |
GitHub. | |
# nix-shell vs nix shell | |
If you started using flakes, you may wonder why there are commands | |
named "nix-shell" and "nix shell", they work totally differently. | |
nix-shell and non flakes commands use the nixpkgs offered in the | |
NIX_PATH environment variable, which should be set to a directory | |
managed by nix-channel, but the channels are obsoleted by flakes... | |
Fortunately, in the same way we synchronized the system flakes with the | |
commands flakes, you can add this code to use the system nixpkgs with | |
your nix-shell: | |
```nix | |
nix.nixPath = [ "nixpkgs=/etc/channels/nixpkgs" "nixos-config=/etc/nixos/config… | |
environment.etc."channels/nixpkgs".source = inputs.nixpkgs.outPath; | |
``` | |
This requires your user to logout from your current session to be | |
effective. You can then check nix-shell and nix shell use the same | |
nixpkgs source with this snippet. This asks the full path of the test | |
program named "hello" and compares both results, they should match if | |
they use the same nixpkgs. | |
```shell | |
[ "$(nix-shell -p hello --run "which hello")" = "$(nix shell nixpkgs#hello -c w… | |
``` | |
# Conclusion | |
Flakes are awesome, and are in the way of becoming the future of Nix. I | |
hope this article shed some light about nix commands, and saved you | |
some bandwidth. | |
# Credits | |
I found this information on a blog post of the company Tweag (which is | |
my current employer) in a series of articles about Nix flakes. That's | |
a bit sad I didn't find this information in the official NixOS | |
documentation, but as flakes are still experimental, they are not | |
really covered. | |
Tweag blog: Nix Flakes, Part 3: Managing NixOS systems | |
As I found this information on their blog post, and I'm fine giving | |
credits to people, so I have to link their blog post license here. | |
Creative Commons Attribution 4.0 International license |