Direnv
The direnv extension provides a method of automatically executing shell
code from a .envrc file when you cd into a directory. It allows
accomplishing numerous things, most notably setting up a shell environment in
the context of a specific project.
Install
The direnv extension is managed by home-manager:
The nix-direnv package is also installed to provide Nix integration.
Usage
The main premise of direnv is to load .envrc files it finds when changing
into a directory. The contents of the .envrc file is shell code. The most
common use case is loading environment variables that make sense in the context
of the directory.
My development environment primarily utilizes this functionality to enter
contextualized nix shells. A flake.nix file located at the root of
the project is responsible for defining the dependencies needed to develop the
project and the nix-direnv integration will automatically create a new shell
environment loaded with these dependencies upon entering the directory.
The result of this is isolated environments for each project which include all the dependnecies necessary to develop against the specific project.
Example
The easiest way to understand usage is through an example. Let's say we have a
Python project that targets Python 3.10 and uses the poetry package
manager for managing dependencies. Ideally, when we develop in this environment
we want to ensure that an isolated copy of Python 3.10 is available and in which
poetry has been installed. This would be the flake.nix:
On line 11 we define a new development shell and then specify pkgs.Python310
as an input. This will ensure that the latest patch version of Python 3.10 is
available in the environment. Additionally, we include the pkgs.poetry package
which is responsible for ensuring poetry is available. The bit on line 14
overrides the Python being used by the pkgs.poetry package to be the same as
the one the rest of the environment depends on. This ensures that we don't
accidently install poetry against a different version of Python which can
cause some strange configuration errors.
With the above flake, we can now create our .envrc file:
The use flake magic comes from the nix-direnv integration and basically
instructs direnv to load our flake.nix. In addition to this, we also
automatically activate our poetry context. The result is that when we cd
into this directory we'll be dropped into an isolated shell with our poetry
dependencies already available to us.