DotenvではなくDirenvを使う

Dotenvは,.envファイルから環境変数を読み込むためのツール.他人には共有したくないパスワードやキーなどを.envに環境変数として記述しておき,実行時にそれを読み込むといった使い方をする.例えば自分は,vagrantからDigitalOceanを使う際に,CLIENT_IDAPI_KEY.envに記述してVagrantfileでそれを読み込むという使い方をしていた.

ただ,Dotenvは汎用性が低い.Dotenvを有効にするには,プログラム内から明示的にDotenv.loadを呼ぶ必要がある,もしくは,dotenvでプログラムを起動する必要がある.例えば,test-kitchendigitaloceanドライバーを使う際には,vagrantの場合と同様にCLIENT_IDAPI_KEYが必要になる.しかし,test-kitchenでユーザが直接触るのは.kitchen.ymlであり,Dotenv.loadを記述する余地はない(直接test-kitchenのソースコードに記述することはできるが…).

TL;DR

Direnvを使うと,任意のディレクトリ以下で.envrcに記述した環境変数を明示的な読み込みなしで有効にすることができる.つまり,DotenvのようなDotenv.loadの記述なしで使える.

また,Direnvはgoで書かれているので,Rubyなしでも使える.

使用例

以下は,簡単な使用例.特定のディレクトリ内で$SECRET_KEYを利用する場合を考える.

$ pwd
/User/tcnksm/test

$ echo $SECRET_KEY

$ direnv edit .
# $Editorが開くので "export SECRET_KEY=thisisalsoanokaysecret"を記述する
direnv: loading .envrc
direnv: export +SECRET_KEY

$ echo $SECRET_KEY
thisisalsoanokaysecret

$ cd ..
direnv: unloading

$ echo $SECRET_KEY

特定にディレクトリに移動するだけで,.envrcが読み込まれ$SECRET_KEYが有効になる.

使いどころ

少なくとも以下の2つの場面で利用できそう.

  • 他人に共有したくない設定を.envrcに環境変数として記述する
  • bundle execしないように.evnrc$PATHを追加する(参考

インストール

OSXの場合は,brewでインストールできる.

$ brew install direnv

以下を.zshrcに記述しておく.

eval "$(direnv hook zsh)"

その他のインストール方法はREADMEを参考に.

まとめ

Direnvはkitchen-digitaloceanにDotenvのサポートのPull Requestを送った際のコメントで教えて頂いた.こういうことはどんどんやっていくべきだと思った.