Pinning the Flake Registry for Nix Search
Nix flakes
is new packaging system for Nix that provides
better separation of concerns and improved reproducibility.
Flakes have lockfile that pins all inputs to a specific version, much like the
lockfiles used by other package managers like npm, yarn or cargo.
To learn more about flakes, I recommend this introductory blog post from Tweag.
An annoying aspect of the current implementation is that searching the package registry has some unexpected behaviour. The package registry is not pinned to the version specified in the lockfile by default.
Instead, nix search nixpkgs some-package
will try to download the current nixpkgs
registry snapshot on each invocation, which leads to very frequent downloads if you are
using nixpkgs-unstable
, and really degrades the user experience with delays.
Thanks to a friendly tip by balsoft
on Matrix I learned that the Nix registry
can be pinned to the specific snapshot with a simple configuration change.
With nix.registry.self.flake = inputs.self
,
we specify self
as a pinned reference to a specific version of nixpkgs,
which will remain stable and won’t be updated each time you run nix search
.
After re-building with nixos-rebuild switch
, we can now query the pinned registry with:
nix search self PKGNAME
.
(note the self
instead of nixpkgs)
Here is a full NixOS config example:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs, home-manager, nixpkgs-wayland }@inputs:
let system = "x86_64-linux";
in
{
nixosConfigurations = {
my-host = nixpkgs.lib.nixosSystem {
system = system;
modules = [
# ... your nix config modules go here
{
# Pin registry so `nix search` doesn't download all the time.
nix.registry.self.flake = inputs.self;
}
];
};
};
};
}
References: