direnvの概要と仕組み
direnvは、シェルの機能を拡張し、カレントディレクトリに応じて環境変数を動的にロード・アンロードするための軽量なユーティリティです。これを導入することで、.bashrcや.zshrcなどのシェル設定ファイルにプロジェクトごとの環境設定を散りばめる必要がなくなり、開発環境の汚染を防ぐと同時に、プロジェクト間のコンテキストスイッチを自動化できます。
インストール方法
主要なOSおよびパッケージマネージャー向けのバイナリが提供されています。環境に合わせて以下のコマンドを実行してください。
パッケージマネージャーを使用する場合
# macOS (Homebrew)
brew install direnv
# Debian/Ubuntu
sudo apt-get install direnv
# Fedora
sudo dnf install direnv
# Arch Linux
sudo pacman -S direnv
Goツールチェーンを使用する場合
go install github.com/direnv/direnv/v2@latest
シェルへのフック設定
direnvがディレクトリの移動を検知して環境変数を適切に処理するためには、使用中のシェルにフックを登録する必要があります。以下の設定をシェルの設定ファイルに追加してください。
# Bash (~/.bashrc)
eval "$(direnv hook bash)"
# Zsh (~/.zshrc)
eval "$(direnv hook zsh)"
# Fish (~/.config/fish/config.fish)
direnv hook fish | source
設定追加後は、シェルの再起動または `source ~/.bashrc`(等)を実行して設定を反映させてください。
基本的な使用フロー
1. .envrcファイルの作成
環境変数を適用したいプロジェクトのルートディレクトリに `.envrc` ファイルを作成し、必要な変数を定義します。標準的なbashシェルコードを使用できます。
# .envrc
export APP_MODE="staging"
export DB_CONN_STRING="mysql://root:secure_pass@127.0.0.1:3306/myapp_db"
# ローカルのバイナリディレクトリをPATHに追加
layout node
2. 設定の有効化
新しく作成した `.envrc` は、セキュリティの観点からデフォルトでブロックされています。以下のコマンドを実行して、このファイルの内容を信頼する(ホワイトリストに登録する)必要があります。
direnv allow
3. 自動切り替えの確認
これ以降、このディレクトリに `cd` で移動すると環境変数が自動的に読み込まれ、ディレクトリから出ると自動的に元の環境に戻ります。動作確認には `direnv status` コマンドを使用してください。
標準ライブラリ(Stdlib)の活用
direnvには、特定の開発環境をセットアップするための便利な関数が標準で組み込まれています。例えば、言語ごとのパス設定や仮想環境の構築を簡略化できます。
# Python仮想環境を自動作成して有効化する場合
layout python3
# Goプロジェクトのパス構成を設定する場合
layout go
高度な設定とトラブルシューティング
設定ファイルによるカスタマイズ
動作の細かい調整を行う場合は、 `~/.config/direnv/direnv.toml` またはプロジェクトルートの `.direnv.toml` を作成します。以下は、リロードの遅延時間などを設定する例です。
[global]
warn_timeout = "5m"
[directory]
disable_stdlib = false
一時的な環境でのコマンド実行
ディレクトリに入らずに、その環境設定を使って単一のコマンドを実行したい場合は `exec` サブコマンドを使用します。
direnv exec /path/to/project bundle exec rake test
トラブルシューティング
環境変数が期待通りに切り替わらない場合は、以下の手順を確認してください。
- シェルのフックが正しくロードされているか確認する(`type direnv` で関数定義を確認)。
direnv reloadを実行して強制的に設定を再読み込みする。- 特定のディレクトリを無視したい場合は、`.envrc` 内で `direnv deny` を実行するか、設定ファイルでホワイトリストを管理する。