Release 1.2 (2012-12-06)
This release has the following improvements and changes:
-
Nix has a new binary substituter mechanism: the binary cache. A binary cache contains pre-built binaries of Nix packages. Whenever Nix wants to build a missing Nix store path, it will check a set of binary caches to see if any of them has a pre-built binary of that path. The configuration setting
binary-caches
contains a list of URLs of binary caches. For instance, doing$ nix-env -i thunderbird --option binary-caches http://cache.nixos.org
will install Thunderbird and its dependencies, using the available pre-built binaries in http://cache.nixos.org. The main advantage over the old “manifest”-based method of getting pre-built binaries is that you don’t have to worry about your manifest being in sync with the Nix expressions you’re installing from; i.e., you don’t need to run
nix-pull
to update your manifest. It’s also more scalable because you don’t need to redownload a giant manifest file every time.A Nix channel can provide a binary cache URL that will be used automatically if you subscribe to that channel. If you use the Nixpkgs or NixOS channels (http://nixos.org/channels) you automatically get the cache http://cache.nixos.org.
Binary caches are created using
nix-push
. For details on the operation and format of binary caches, see thenix-push
manpage. More details are provided in this nix-dev posting. -
Multiple output support should now be usable. A derivation can declare that it wants to produce multiple store paths by saying something like
outputs = [ "lib" "headers" "doc" ];
This will cause Nix to pass the intended store path of each output to the builder through the environment variables
lib
,headers
anddoc
. Other packages can refer to a specific output by referring topkg.output
, e.g.buildInputs = [ pkg.lib pkg.headers ];
If you install a package with multiple outputs using
nix-env
, each output path will be symlinked into the user environment. -
Dashes are now valid as part of identifiers and attribute names.
-
The new operation
nix-store --repair-path
allows corrupted or missing store paths to be repaired by redownloading them.nix-store --verify --check-contents --repair
will scan and repair all paths in the Nix store. Similarly,nix-env
,nix-build
,nix-instantiate
andnix-store --realise
have a--repair
flag to detect and fix bad paths by rebuilding or redownloading them. -
Nix no longer sets the immutable bit on files in the Nix store. Instead, the recommended way to guard the Nix store against accidental modification on Linux is to make it a read-only bind mount, like this:
$ mount --bind /nix/store /nix/store $ mount -o remount,ro,bind /nix/store
Nix will automatically make
/nix/store
writable as needed (using a private mount namespace) to allow modifications. -
Store optimisation (replacing identical files in the store with hard links) can now be done automatically every time a path is added to the store. This is enabled by setting the configuration option
auto-optimise-store
totrue
(disabled by default). -
Nix now supports
xz
compression for NARs in addition tobzip2
. It compresses about 30% better on typical archives and decompresses about twice as fast. -
Basic Nix expression evaluation profiling: setting the environment variable
NIX_COUNT_CALLS
to1
will cause Nix to print how many times each primop or function was executed. -
New primops:
concatLists
,elem
,elemAt
andfilter
. -
The command
nix-copy-closure
has a new flag--use-substitutes
(-s
) to download missing paths on the target machine using the substitute mechanism. -
The command
nix-worker
has been renamed tonix-daemon
. Support for running the Nix worker in “slave” mode has been removed. -
The
--help
flag of every Nix command now invokesman
. -
Chroot builds are now supported on systemd machines.
This release has contributions from Eelco Dolstra, Florian Friesdorf, Mats Erik Andersson and Shea Levy.