🌳

ディレクトリごとに環境変数を切り替えるシェルの拡張機能direnv

2022/04/19に公開

はじめに

direnvはディレクトリの移動をトリガーに、環境変数を追加・削除できるシェルの拡張機能である。

https://github.com/direnv/direnv

ユースケースとしては以下が挙げられている。

  • Load 12factor apps environment variables
  • Create per-project isolated development environments
  • Load secrets for deployment
  • THE TWELVE-FACTOR APPの環境変数を読み込む
  • プロジェクトごとに開発環境を構築する
  • デプロイするための秘密情報を読み込む

インストールとシェルへのフック設定

Homebrewからインストール可能。

% brew update && brew install direnv
...
% direnv --version
2.31.0

direnvを使うためには、direnvをシェルにフックする必要がある。
シェルごとに設定方法が異なるが、今回はzshの設定を。
zshの場合、~/.zshrcファイルの最後に以下の1行を追加する。

~/.zshrc
eval "$(direnv hook zsh)"

ちなみにevalコマンドは、指定した文字列を評価(展開)した後に、カレントシェルに実行させるコマンドで、evaluate(評価する)に由来している。

フックの設定が終わったら、シェルを再起動することでdirenvが有効になる。

使い方

direnvは、各プロンプトの前に、カレントディレクトリと親ディレクトリに.envrcまたは.envが存在するかどうかをチェックする。ファイルが存在する場合、そのファイルはbashのサブシェルに読み込まれ、エクスポートされたすべての変数はdirenvによって捕捉され、カレントシェルで利用できるようになる。
.envrc.envの両方のファイルが存在する場合、.envrcが優先される)

まずは環境変数を設定するディレクトリへ移動し、設定していない環境変数を試しに出力してみる。

% cd /hoge/fuga/bar
% echo $FOO
// もちろん何も出力されない

direnvによって読み込まれる.envrcを作成する、

% echo export FOO=foo > .envrc
direnv: error /hoge/fuga/bar/.envrc is blocked. Run `direnv allow` to approve its content

のだが、.envrcは新規作成・編集後には一旦無効状態となるため、direnv allow .を実行して有効化する必要がある。

% direnv allow .
direnv: loading /hoge/fuga/bar/.envrc                 
direnv: export +FOO

これで.envrcが有効化されたため、設定した環境変数を出力してみる。

% echo $FOO
foo

このように設定したものがきちんと出力される。
そして、別のディレクトリに移動すると、direnv: unloadingと出力されるように、そのディレクトリでは先ほど設定した環境変数が使えなくなっていることが分かる。

% cd ..
direnv: unloading
% echo $FOO
// 何も出力されない

最後に、機密情報を書くこともあるため、.envrc.gitignoreに追加しておく。

Discussion