環境変数を自動切り替えできるdirenvを使ってみる


direnvはディレクトリに応じて自動で環境変数を設定してくれるツールです。

今までpythonやnode.jsのCLIツールを作るときはdotenvという類似ツールを使っていましたが、プログラム上で環境変数を記載した設定ファイル読み込む必要があり煩わしさがありました。

direnvはカレントディレクトリに設定ファイルを置くだけで自動的に環境変数を読み込んでくれ、より使い勝手が良さそうなので試してみることにします。

インストール方法

macOSにてHomeBrewを利用している場合は、次のコマンドでインストールできます。

$ brew install direnv

その他のLinux環境にインストールする場合はこちら。

$ git clone https://github.com/direnv/direnv
$ cd direnv
$ sudo make install

インストールが完了した後は自動で読み込むための設定として、~/.bashrcに設定を追記します。
※zshやfish等を利用している場合は、それぞれ読み替えてください。

$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ echo 'export EDITOR="/usr/bin/vim"' >> ~/.bashrc

設定が完了したら再読込を行います。

$ source ~/.bashrc

上手くインストールできているか確認してみます。

$ direnv version
2.19.1

direnvについてもっと詳しく知りたい方はGitHubをご覧ください。

direnv/direnv

使い方

環境変数を設定したい開発環境のディレクトリに移動します。

$ cd ~/my-app/

direnv edit ディレクトリコマンドを実行すると設定ファイルを編集するためエディタが起動します。
今回はこのディレクトリ以下にTEST_TOKENという環境変数を追加してみます。

$ direnv edit .
# vimが起動するので環境変数を入力 
# ex. export TEST_TOKEN=1234567890
# 入力後、エディタを閉じる
direnv: loading .envrc
direnv: export +TEST_TOKEN

追加したTEST_TOKENが環境変数として確認できるか確かめてみましょう。

$ env | grep TEST
TEST_TOKEN=1234567890

設定ファイルがあるディレクトリ外に移動すると自動的に読み込みが解除されます。

$ cd ..
direnv: unloading
$ env | grep TEST
# 出力なし

逆に設定ファイルがあるディレクトリに移動すると自動的に読み込まれます。

$ cd my-app/
direnv: loading .envrc
direnv: export +TEST_TOKEN
$ env | grep TEST
TEST_TOKEN=1234567890

設定ファイルは.envrcというファイル名で作成されます。

重要な設定情報をGitHub等に公開しないように.envrcファイルは.gitignoreでコミット対象外にしておきましょう。

ちなみに直接ファイルを修正することも可能です。

$ vim .envrc
# 下記を追加して保存
# export TEST2=abcde
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.

エラーとなるのでメッセージに従ってコマンドを実行すると正常に読み込まれるようになります。

$ direnv allow
direnv: loading .envrc
direnv: export +TEST2 +TEST_TOKEN

$ env | grep TEST
TEST_TOKEN=123456789
TEST2=abcde