ディレクトリごとに環境変数を切り替えるシェルの拡張機能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行を追加する。
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