direnv について
direnv はカレント作業ディレクトリに基づいて環境変数を自動で管理し、プロジェクトディレクトリに入るときに読み込み、出るときにアンロードします。.envrc ファイルで設定でき、shell の設定を変更せずに異なるプロジェクト間で環境を隔離できます。
主な機能
- 01ディレクトリ進入時に .envrc の環境変数を自動読み込み
- 02ディレクトリ離脱時に環境変数を自動アンロードして shell を清潔に保つ
- 03bash、zsh、fish など複数の shell 統合に対応
- 04direnv allow で安全にスクリプト実行を承認
活用シーン
- 01プロジェクト間で環境変数を隔離して競合を防止
- 02プロジェクト固有の API キーと設定を管理
- 03開発ツールと依存関係の異なるバージョンを自動切り替え
インストール
OS またはパッケージマネージャーを選び、コマンドをターミナルで実行します。
インストール後にdirenv --versionを実行して確認します。
コマンド例
よく使うコマンドを使う順に並べています。
詳細
direnv -- .profile をすっきりさせる
direnv はシェルの拡張機能です。現在のディレクトリに応じて環境変数を読み込み、解除する機能を追加し、既存のシェルを拡張します。
ユースケース
- 12factor アプリの環境変数を読み込む
- プロジェクトごとに分離された開発環境を作成する
- デプロイ用のシークレットを読み込む
仕組み
各プロンプトの前に、direnv は現在のディレクトリと親ディレクトリに .envrc ファイルがあるかどうか(およびオプションで .env ファイルがあるかどうか)を確認します。ファイルが存在し(許可されている場合)、bash のサブシェルに読み込まれます。エクスポートされた変数はすべて direnv によって取得され、現在のシェルから利用できるようになります。
bash、zsh、tcsh、fish など、一般的なすべてのシェルに対応するフックをサポートしています。これにより、~/.profile ファイルを散らかさずに、プロジェクト固有の環境変数を設定できます。
direnv は単一の静的実行ファイルにコンパイルされるため、各プロンプトで実行しても気にならないほど高速です。また、言語に依存せず、rbenv、pyenv、phpenv に似たソリューションの構築にも使用できます。
はじめに
前提条件
- Unix 系オペレーティングシステム(macOS、Linux など)
- 対応するシェル(bash、zsh、tcsh、fish、elvish、powershell、murex、nushell)
基本的なインストール
- direnv はすでにほとんどのディストリビューションでパッケージ化されています。詳細はインストールのドキュメントを参照してください。
- シェルに direnv のフックを追加します。
シェルを再起動してください。
クイックデモ
direnv をインストールしたら、シェルで以下の手順を試してみてください。
# Create a new folder for demo purposes.
$ mkdir ~/my-project
$ cd ~/my-project
# Show that the FOO environment variable is not loaded.
$ echo ${FOO-nope}
nope
# Create a new .envrc. This file is bash code that is going to be loaded by
# direnv.
$ echo export FOO=foo > .envrc
.envrc is not allowed
# The security mechanism didn't allow to load the .envrc. Since we trust it,
# let's allow its execution.
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
# Show that the FOO environment variable is loaded.
$ echo ${FOO-nope}
foo
# Exit the project
$ cd ..
direnv: unloading
# And now FOO is unset again
$ echo ${FOO-nope}
nope
一部の標準ライブラリ関数は .direnv/ にファイルを保存します。.direnv/ を .gitignore に追加してください。コミットしないローカルの上書き設定には、.envrc に source_env_if_exists .envrc.local を記述し、.envrc.local も無視するようにしてください。
標準ライブラリ
変数を手動でエクスポートするのは少し面倒なため、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 を追加して、続けて .env ファイルも読み込むよう direnv に指示できます。
ドキュメント
- direnv のインストール
- シェルにフックを追加
- direnv の開発
- direnv と ruby-install で Ruby を管理する
- GitHub Actions で direnv を使用する
- コミュニティ Wiki
ぜひ Wiki も確認してください。よく使われるレシピ、エディターとの連携、ヒントやコツなど、役立つ情報が満載です。
マニュアルページ
- direnv(1) のマニュアルページ
- direnv-fetchurl(1) のマニュアルページ
- direnv-stdlib(1) のマニュアルページ
- direnv.toml(1) のマニュアルページ
FAQ
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 を使っている場合に、ぜひご覧いただきたいプロジェクトの一覧です。
- starship - 複数のシェルに対応したプロンプトです。
- Nix 統合向けプロジェクト - Direnv に組み込まれている
use_nix実装を改善する、さまざまなプロジェクトから選べます。
関連プロジェクト
同じ設計領域にあるほかのプロジェクトの一覧です。新しいプロジェクトの追加も歓迎します。
- Environment Modules - (良い意味で)最も歴史のある環境読み込みシステムのひとつです
- autoenv - より古く、人気があり、軽量です。
- zsh-autoenv - autoenv と smartcd を組み合わせた、豊富な機能を備えるツールです。入退室イベント、ネスト、退避に対応しています(Zsh 専用)。
- asdf - プラグインシステムを備えた純粋な bash ソリューションです。asdf-direnv プラグインを使うと、asdf で管理されるツールを direnv で利用できます。
- ondir - OnDir は、特定のディレクトリに固有のタスクを自動化する小さなプログラムです
- shadowenv - s 式形式を使って、実行する環境変更を定義します
- quickenv - シェルにフックせず、利便性より速度を重視する
.envrcファイル用の代替ローダーです。 - mise - direnv、make、asdf をひとつにまとめたツールです。
商用サポート
サポートやカスタマイズをご希望ですか?
Numtide にお問い合わせいただければ、お見積もりいたします。企業がオープンソースプロジェクトと連携しやすいようサポートしています。https://numtide.com/contact