Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from dataswamp.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.