(automatic-direnv)=
# `direnv`로 환경 자동 활성화하기

프로젝트마다 환경을 수동으로 활성화하는 대신, 프로젝트 디렉터리에 들어가거나 그 안의 `shell.nix`를 변경할 때마다 [선언적 셸](declarative-reproducible-envs)을 다시 로드하도록 할 수 있습니다.

1. [nix-direnv를 사용할 수 있게 하십시오](https://github.com/nix-community/nix-direnv)
2. [셸에 훅으로 연결하십시오](https://direnv.net/docs/hook.html)

예를 들어, 다음 내용으로 `shell.nix`를 작성하십시오.

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

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

프로젝트의 최상위 디렉터리에서 다음을 실행하십시오.

```shell-session
$ echo "use nix" > .envrc && direnv allow
```

다음에 터미널을 실행하고 프로젝트의 최상위 디렉터리에 들어가면 `direnv`가 `shell.nix`에 정의된 셸을 자동으로 실행합니다.

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

`direnv`는 `shell.nix` 파일의 변경 사항도 확인합니다.

다음 내용을 추가하십시오.

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

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

실행 중인 환경은 첫 번째 상호작용(아무 명령이나 실행하거나 `Enter` 키를 누르기) 후에 스스로 다시 로드됩니다.

```shell-session
Hello, world!
```
