以前、Node.jsで環境変数を管理する方法として、dotenv
について書いた。
だがdirenv
を使えばもっと簡単に環境変数を管理できることを知った。
この記事の内容はmacOSの10.13.5
で動作確認している。
セットアップ
homebrew
を使っていれば非常に簡単に出来る。
homebrew
でインストール~/.bashrc
にeval "$(direnv hook bash)"
と書き込む- 書き込んだ内容を反映させる
$ brew install direnv $ cat >> ~/.bashrc eval "$(direnv hook bash)" ^C $ source ~/.bashrc
これで使えるようになった。
使い方
.envrc
に、使いたい環境変数を書いていく。
書き方はexport 環境変数名=値
。
こうすると、.envrc
が置いてあるディレクトリ以下でその環境変数を使えるようになる。
例として、値がhoge
の環境変数HOGE
を設定してみる。
まず、HOGE
が存在しないことを確認。
$ echo ${HOGE-nope} nope
次に、.envrc
を作成してexport HOGE=hoge
と書き込む。
.envrc
を作成したり編集したりするとエラーが出ることがあるので、そのときは$ direnv allow
を実行する。
$ echo export HOGE=hoge > .envrc direnv: error .envrc is blocked. Run `direnv allow` to approve its content. $ direnv allow direnv: loading .envrc direnv: export +HOGE
これでHOGE
を使えるようになったはずなので、確認してみる。
$ echo ${HOGE-nope} hoge
対象となるのは.envrc
が置かれているディレクトリ以下なので、他の場所には影響を与えない。
$ cd ../ direnv: unloading $ echo ${HOGE-nope} nope
下の階層にも.envrc
を置けばその内容が採用される。
上位にある.envrc
は無視される。
試しにまず、先程の.envrc
にFUGA
を追加してみる。
$ echo export FUGA=fuga >> .envrc direnv: loading .envrc direnv: export +FUGA +HOGE $ echo ${HOGE-nope} hoge $ echo ${FUGA-nope} fuga
子ディレクトリに移動してみるが、親ディレクトリにある.envrc
の内容が使われている。
$ mkdir child && cd child $ echo ${HOGE-nope} hoge $ echo ${FUGA-nope} fuga
子ディレクトリに.envrc
を作成しFUGA
について設定する。
そうすると、その内容が反映される。
$ echo export FUGA=child > .envrc direnv: error .envrc is blocked. Run `direnv allow` to approve its content. $ direnv allow direnv: loading .envrc direnv: export +FUGA $ echo ${FUGA-nope} child
ではHOGE
はどうなっているのかというと、存在しないことになっている。
${HOGE-nope} nope
つまり、子ディレクトリにある.envrc
が採用され、親ディレクトリの.envrc
は無視される。
プログラムからの利用
.envrc
に書いてあるものは他の環境変数と同じように扱われるので、プログラムのなかで問題なく取得することが出来る。
dotenv
と違ってnpmモジュールをインストールする必要がないし、言語をまたがって使用することが出来る。
例として、Node.jsとRubyで使えることを確認してみる。
それぞれ以下の内容で、test.js
、test.rb
というファイルを作る。
console.log(process.env.SHELL); console.log(process.env.HOGE);
puts ENV['SHELL'] puts ENV['HOGE']
確認のため、.envrc
を削除して環境変数HOGE
が存在しない状態に戻す。
この状態でそれぞれのプログラムを実行すると、最初から設定されているSHELL
は取得できるが、HOGE
は取得できない。存在しないので当然だが。
$ rm .envrc direnv: unloading $ echo ${HOGE-nope} nope $ node test.js /bin/bash undefined $ ruby test.rb /bin/bash
HOGE
を用意した上でプログラムを実行すると、正しく取得できていることが分かる。
$ echo export HOGE=hoge > .envrc direnv: loading .envrc direnv: export +HOGE $ echo ${HOGE-nope} hoge $ node test.js /bin/bash hoge $ ruby test.rb /bin/bash hoge
Gitの管理から外す
環境変数にはアクセスキーなどのセンシティブな内容を入れることが多いはずなので、.gitignore
で指定するなどして、慎重に管理する。