The setting

Using Nix to manage development environments is a very good choice: It works cross language, it handles C dependencies quite nice, it works on MacOS and Linux in the same way and it provides a ton of nice extra features.

Looking from the perspective of a developer, the following command should get you set up:


I have written down a few notes about how to use it for Node and for Python if you are interested in more details about how I am using it for my projects currently.


One benefit is that Nix comes together with a huge package collection: Nixpkgs. It is available via different channels, most interesting for development are the channels unstable and stable. I like to recommend colleagues to work against the channel stable by default, and consider switching to unstable once they feel more confident about mastering Nix. For releases I prefer to build software against the channel stable.

Every now and then a new challenge comes up when unstable introduces a change which is incompatible with the last stable channel. Since I am developing mainly against the unstable channel, I need a quick way to find out if my derivations would still work with the stable channel.

Building against a different channel

Using nix-shell and nix-build allows to change the import path. This allow to change where it will look for nixpkgs:

nix-shell -I nixpkgs=~/my-local-clone-of-nixpkgs

The import path can also include a URL, which allows us to grab the channel directly from Github without having to prepare a local clone first:

nix-build -I nixpkgs=

As an alternative, the path can also be modified via the environment variable NIX_PATH. This is useful if a few runs of nix-build shall be performed:

export NIX_PATH=nixpkgs=


comments powered by Disqus