1
0
Fork 0
mirror of https://github.com/NixOS/nix.dev.git synced 2024-10-18 14:32:43 -04:00
nix.dev/source/guides/recipes/direnv.md
Valentin Gagarin 5ec1a4967c use nixShellNoCC in tutorials and guides
in our examples we never actually use the compiler toolchain stuff from
`mkShell`, so we may as well not burden users with large downloads.
2024-02-06 21:16:17 +01:00

1.6 KiB

(automatic-direnv)=

Automatic environment activation with direnv

Instead of manually activating the environment for each project, you can reload a declarative shell every time you enter the project's directory or change the shell.nix inside it.

  1. Make nix-direnv available
  2. Hook it into your shell

For example, write a shell.nix with the following contents:

let
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-22.11";
  pkgs = import nixpkgs { config = {}; overlays = []; };
in

pkgs.mkShellNoCC {
  packages = with pkgs; [
    hello
  ];
}

From the top-level directory of your project run:

$ echo "use nix" > .envrc && direnv allow

The next time you launch your terminal and enter the top-level directory of your project, direnv will automatically launch the shell defined in shell.nix

$ cd myproject
$ which hello
/nix/store/1gxz5nfzfnhyxjdyzi04r86sh61y4i00-hello-2.12.1/bin/hello

direnv will also check for changes to the shell.nix file.

Make the following addition:

 let
   nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-22.11";
   pkgs = import nixpkgs { config = {}; overlays = []; };
 in

 pkgs.mkShellNoCC {
   packages = with pkgs; [
     hello
   ];
+
+  shellHook = ''
+    hello
+  '';
 }

The running environment should reload itself after the first interaction (run any command or press Enter).

Hello, world!