direnv
はシェルの拡張です。
現在のディレクトリによって、環境変数の読み込みないし読み戻しをする新しい機能で、既存のシェルを拡張します。
各プロンプトの前に、現在のディレクトリとその上位のディレクトリの.envrc
ファイル(と任意で.env
ファイル)の存在がdirenvにより確認されます。
ファイルが存在するとき(かつ権限があるとき)、bashの副シェルに読み込まれ、全てのエクスポートされた変数がdirenvに捕捉されて、現在のシェルで使えるようになります。
bash、zsh、tcsh、fishといった全ての一般的なシェルのフックに対応しています。
これにより、~/.profile
ファイルを散らかすことなく、プロジェクト固有の環境変数が使えます。
direnvは単一の静的実行ファイルにコンパイルされるため、プロンプトが表示されるとき、存在を感じさせない程度には高速です。 また言語に依らないため、rbenv、pyenv、phpenvに似たソリューションの構築に使えます。
それからシェルを再起動させてください。
direnvがインストールされたら、シェルで以下をやってみましょう。
# デモ用に新しいフォルダを作ります。
$ mkdir ~/my-project
$ cd ~/my-project
# FOO環境変数が読み込まれていないことを確かめます。
$ echo ${FOO-nope}
nope
# 新しく.envrcを作ります。このファイルはbashのコードで、direnvにより読み込まれます。
$ echo export FOO=foo > .envrc
.envrc is not allowed
# 安全上の仕組みにより、.envrcの読み込みが許可されませんでした。
# ここでは信頼できるため、実行を許可しましょう。
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
# FOO環境変数が読み込まれたことを確かめます。
$ echo ${FOO-nope}
foo
# プロジェクトを出ます
$ cd ..
direnv: unloading
# するとFOOは再び未設定になりました
$ echo ${FOO-nope}
nope
手作業で変数をエクスポートするのは、ちょっとした作業の繰り返しになってしまいます。
そこでdirenvでは、いろいろな補助関数が提供されており、.envrc
ファイルの文脈で使えるようになっています。
例えば、PATH_add
関数は$PATH環境変数にパスを拡張したり、前置したりするのに使います。
export PATH=$PWD/bin:$PATH
とする代わりに、PATH_add bin
と書けます。
こちらの方が短く、$PATH=bin
のようなよくある誤りを避けられます。
使える全ての関数の文書については、direnv-stdlib(1)のmanページをご確認ください。
~/.config/direnv/direnvrc
や~/.config/direnv/lib/*.sh
にbashファイルを作ると、自分だけの拡張を作ることもできます。
このファイルは.envrc
より前に読み込まれるため、direnvに独自の拡張を作ることができるようになっているのです。
なお、この機能は.env
ファイルでは対応していません。両方を共存させる必要があるときは、.envrc
の標準ライブラリを活用し、末尾にdotenv
を付けることで、次にdirenvに.env
も読むよう伝えられます。
ぜひウィキをご覧ください! よくあるレシピ、エディタとの統合、コツやトリックといった、多岐にわたる有用な情報が含まれています。
GitHubの質問のやり取りに基づいたところ、利用者が混乱しがちなことの上位にくるものとして以下があります。
direnvには関数の標準ライブラリがあります。 これは補助機能の集まりであり、あって便利だと気付いて長年にわたって蓄積してきたものです。 https://github.com/direnv/direnv/blob/master/stdlib.sh にあります。
~/.config/direnv/direnvrc
にbashファイルを追加して、自分だけの関数の集まりで標準ライブラリを上塗りすることができます。
このファイルが読み込まれると、その内容は任意の.envrc
ファイルで使えるようになります。
direnvは、現在のシェルに.envrc
を読み込みません。
新しいbashの副プロセスを作り、標準ライブラリ、direnvrc、.envrc
を読み込んで、環境の差分を元のシェルに送り返すだけです。
これにより、direnvは環境の変更を正確に記録することができ、また全ての種類のシェルで動作します。
また、エイリアスと関数は現時点でエクスポートできないということでもあります。
不具合の報告、貢献やフォークは歓迎します。 不具合やその他の議論は全て、 http://github.com/direnv/direnv/issues でされています。
もしくは、チャットをする際はMatrixにお立ち寄りください。 質問するときは、全員が一日中アクティブではないため、回答が返ってくるまでしばらく待ってみてください。
テストを実行するには、次のコマンドを使ってください(homebrewをインストールする必要があるかもしれません)。
brew bundle
make test
以下は、direnvを使う場合に見てみると良さそうなプロジェクトの一覧です。
use_nix
の実装をさらに向上させる、様々なプロジェクトがあります。ご自由にお選びください。以下は、同じ設計の領域にある他のプロジェクトの一覧です。 新しいものがあったら遠慮なくご提案ください。
.envrc
ファイルの読込器で、シェルにフックを掛けません。利便性と引き換えに速度に長けています。ヘルプやカスタマイズをお求めですか?
お見積もりはNumtideまでご連絡ください。 我々は企業がオープンソースプロジェクトと協働しやすくなるようにしています:https://numtide.com/contact
MIT licence - Copyright (C) 2019 @zimbatm と貢献者の方々