direnv

direnv – .profileを散らかさない

Nixでビルド パッケージ化の状態 最新のパッケージバージョン Matrixのサポート場所

direnvはシェルの拡張です。 現在のディレクトリによって、環境変数の読み込みないし読み戻しをする新しい機能で、既存のシェルを拡張します。

用途

仕組み

各プロンプトの前に、現在のディレクトリとその上位のディレクトリの.envrcファイル(と任意で.envファイル)の存在がdirenvにより確認されます。 ファイルが存在するとき(かつ権限があるとき)、bashの副シェルに読み込まれ、全てのエクスポートされた変数がdirenvに捕捉されて、現在のシェルで使えるようになります。

bash、zsh、tcsh、fishといった全ての一般的なシェルのフックに対応しています。 これにより、~/.profileファイルを散らかすことなく、プロジェクト固有の環境変数が使えます。

direnvは単一の静的実行ファイルにコンパイルされるため、プロンプトが表示されるとき、存在を感じさせない程度には高速です。 また言語に依らないため、rbenv、pyenv、phpenvに似たソリューションの構築に使えます。

始め方

事前要件

基本的なインストール方法

  1. direnvは既にほとんどのディストリビューションでパッケージ化されています。 詳細はインストール方法の文書をご参照ください。
  2. シェルにdirenvをフックする

それからシェルを再起動させてください。

簡単なデモ

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も読むよう伝えられます。

文書

ぜひウィキをご覧ください! よくあるレシピ、エディタとの統合、コツやトリックといった、多岐にわたる有用な情報が含まれています。

manページ

よくある質問

GitHubの質問のやり取りに基づいたところ、利用者が混乱しがちなことの上位にくるものとして以下があります。

  1. direnvには関数の標準ライブラリがあります。 これは補助機能の集まりであり、あって便利だと気付いて長年にわたって蓄積してきたものです。 https://github.com/direnv/direnv/blob/master/stdlib.sh にあります。

  2. ~/.config/direnv/direnvrcにbashファイルを追加して、自分だけの関数の集まりで標準ライブラリを上塗りすることができます。 このファイルが読み込まれると、その内容は任意の.envrcファイルで使えるようになります。

  3. direnvは、現在のシェルに.envrcを読み込みません。 新しいbashの副プロセスを作り、標準ライブラリ、direnvrc、.envrcを読み込んで、環境の差分を元のシェルに送り返すだけです。 これにより、direnvは環境の変更を正確に記録することができ、また全ての種類のシェルで動作します。 また、エイリアスと関数は現時点でエクスポートできないということでもあります。

貢献

不具合の報告、貢献やフォークは歓迎します。 不具合やその他の議論は全て、 http://github.com/direnv/direnv/issues でされています。

もしくは、チャットをする際はMatrixにお立ち寄りください。 質問するときは、全員が一日中アクティブではないため、回答が返ってくるまでしばらく待ってみてください。

テスト

テストを実行するには、次のコマンドを使ってください(homebrewをインストールする必要があるかもしれません)。

brew bundle
make test

相補的なプロジェクト

以下は、direnvを使う場合に見てみると良さそうなプロジェクトの一覧です。

関連するプロジェクト

以下は、同じ設計の領域にある他のプロジェクトの一覧です。 新しいものがあったら遠慮なくご提案ください。

商業支援

ヘルプやカスタマイズをお求めですか?

お見積もりはNumtideまでご連絡ください。 我々は企業がオープンソースプロジェクトと協働しやすくなるようにしています:https://numtide.com/contact

著作情報

MIT licence - Copyright (C) 2019 @zimbatm貢献者の方々