nix develop command to activate a Nix development environment defined in Nixpkgs
→Run a command inside a development environment without actually entering that environment
→Explore Nix development environments tailored to specific programming languages
→Explore a more mixed development environment
nix develop to activate an environment defined in a local flake
One of Nix's key features for developing software is Nix development environments. You can define development environments of any complexity using the Nix language. We'll cover that a bit later, but for now let's get a feel for what a Nix development environment is and how it works.
nix develop command activates a Nix environment:
nix develop "github:DeterminateSystems/zero-to-nix#example"
You should be greeted by a new shell prompt, something like this:
🚀 Success! You're now in a Bash environment that includes curl and Git. You may already have both in your environment, but run these commands to see that something new is happening:
type curl type git
For curl, for example, you should see a strange path like this (the hash part should be different on your machine):
/nix/store/ 1. Nix store prefixsglc12hc6pc68w5ppn2k56n6jcpaci16 2. Hash part-curl-7.86.0-bin 3. Package name/bin/curl 4. Program path
What happened here? The Nix CLI did a few things:
github:DeterminateSystems/zero-to-nixflake reference to pull in some Nix code and built a specific flake output (more on this later).
PATHthat enables the
curlpackages to be discovered in the Nix store.
Two other things that you can provide in Nix development environments:
echo information about the environment to the console whenever the environment is activated
Run things like checks and linters
Ensure that other desired hooks, like Git hooks, are properly set up. Run this to see an example shell hook:
nix develop "github:DeterminateSystems/zero-to-nix#hook"
echo $FUNNY_JOKEto access a (hilarious) value that's available only in the Nix environment. Some example use cases for environment variables:
LOG_LEVELor whatever is appropriate for the tools you're using.
NODE_ENV(for Node.js) to
dev, and so on.
Let's leave the Nix development environment to prepare for the next section:
If you have Git installed, check your
PATH for it using
It should be at a global path like
And if you run
echo $FUNNY_JOKE again you should get an empty string (unless you happen to have that variable set on your machine!).
While it's fun to explore the environment, you don't always want to be inside the environment to use it.
nix develop command provides a
-c) flag that you can use to run commands that use the environment but from your current environment.
Here are some examples for the environment we used earlier:
nix develop "github:DeterminateSystems/zero-to-nix#example" --command git help nix develop "github:DeterminateSystems/zero-to-nix#example" --command curl https://example.com
In both cases, you're running a package in the Nix store and nothing from your global environment.
As you can see, Nix development environments are hermetic in that they're isolated from the surrounding environment (such as your environment variables and paths like
As we did in the last section, let's get a bit more specific and explore how Nix can benefit more specific programming environments. Select one of these programming languages:
Select your language
Now explore the Nix development environment for
First, let's see the Nix store path for Node.js:
Now use Node to run a program:
node --eval "console.log('1 + 1 = ' + (1 + 1))"
Like usual, run
exit to leave the Nix environment and return to your usual environment.
In the previous section, we explored Nix environments tailored to specific programming languages. But Nix environments are infinitely flexible, enabling you to combine whichever packages you like. Let's explore an example of this:
nix develop "github:DeterminateSystems/zero-to-nix#multi"
This Nix environment has several tools available:
As in the previous examples, you can run commands like
type python and
type kubectl to see that these tools are all discoverable in the Nix store and not somewhere like
This list could easily include 100 packages.
It's up to you.
We won't cover how to create these environments just yet, but we hope that you come away from this guide with a basic sense of what Nix development environments provide.
direnv is a popular tool that automatically loads specific environment variables whenever you
cd into a directory (and then unloads those variables when you
cd out of the directory).
The combination of direnv and Nix can be quite powerful, enabling you to automatically load Nix development environments whenever you navigate to a directory.
For more info, see Effortless dev environments with Nix and direnv on the Determinate Systems blog.
Earlier in this guide, we activated a Nix development environment defined in a flake on GitHub. While using an environment in this way is helpful, it's more common to use a development environment defined in a local flake in the current directory.
First, tell us which language you prefer:
Select your language
To get started in your
Once the template has been initialized, run
ls . to see the contents of the directory, which should include two important files:
flake.nixfile defines the flake for your project.
flake.lockpins all of the flake inputs—essentially the Nix dependencies—in your
flake.nixfile to specific Git revisions.
One of the flake outputs of this Nix flake is a development environment for
Now that we've entered the development environment, we can do some exploring, starting with Nix store paths.
Ordinarily when you run
type node on a Unix system, you get a path like
Try running it in the Nix development environment:
You should see a (rather strange) path like this:
node is /nix/store/i88kh2fd03f5fsd3a948s19gliggd2wd-nodejs-18.12.1/bin/node
Probably not what you expected! What happened here? A few things:
devShellsflake outputs in
flake.nixto figure out which Nix packages to include in the development environment (Nix specifically looked at the
packagesand stored them in the Nix store under