One of the things that NixOS and Hydra make easy is running your own custom cache of packages. A number of projects and companies make use of this.
A NixOS or Nix user can then make use of these caches
by adding them to nix.conf
for Nix users or /etc/nixos/configuration.nix
for NixOS users.
What most people will want, is for their devices to have access to both caches.
If you add the new cache "incorrectly", you may suddenly find your device building almost everything from source, as I did.
The default /etc/nix/nix.conf
for NixOS users has these default lines:
substituters = https://cache.nixos.org
...
trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
Many projects running custom caches will advise NixOS users to add a stanza
like this to /etc/nixos/configuration.nix
:
{
nix = {
binaryCaches = [
"https://cache.my-project.org/"
];
binaryCachePublicKeys = [
"cache.my-project.org:j/Kb+r+tGeM+4YZH+ECfTr+b4OFViKHaciuIOHw1/DP="
];
};
}
If you add this stanza to your NixOS configuration, you will end up with a nix.conf
that looks like this:
...
substituters = https://cache.my-project.org/
...
trusted-public-keys = cache.my-project.org:j/Kb+r+tGeM+4YZH+ECfTr+b4OFViKHaciuIOHw1/DP=
...
Which will result in your systems only pulling cached packages from that cache and building everything else that's missing.
If you want to take advantage of what a custom cache is providing but not lose the advantages of the primary NixOS cache, your stanza in configuration.nix
needs to looks like this:
{
nix = {
binaryCaches = [
"https://cache.nixos.org"
"https://cache.my-project.org/"
];
binaryCachePublicKeys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"cache.my-project.org:j/Kb+r+tGeM+4YZH+ECfTr+b4OFViKHaciuIOHw1/DP="
];
};
}
You will now get the benefit of both caches and your nix.conf
will now look like:
...
substituters = https://cache.nixos.org https://cache.my-project.org/
...
trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= cache.my-project.org:j/Kb+r+tGeM+4YZH+ECfTr+b4OFViKHaciuIOHw1/DP=
...
The order does not matter, I just feel more comfortable putting the cache I consider "primary" first. The order is determined by NixOS, using the cache-info
file from each Hydra cache:
$ curl https://cache.nixos.org/nix-cache-info
StoreDir: /nix/store
WantMassQuery: 1
Priority: 40
If you were experiencing excessive building from source and your intention was to draw from two caches, this should resolve it for you.