direnv入門:ディレクトリごとに環境変数を自動で切り替える
はじめに
direnvはディレクトリに入ると環境変数を自動でセットし、出ると元に戻してくれるツールです。プロジェクトごとに異なるAPIキーやデータベースURLを .envrc ファイルで管理できます。
cd my-project # → 環境変数が自動でセットされる cd .. # → 環境変数が元に戻る
インストール
# macOS(Homebrew) brew install direnv # Ubuntu / Debian apt install direnv # mise経由 mise use --global direnv
インストール後、シェルのrcファイルにフックを追加します。
# ~/.zshrc eval "$(direnv hook zsh)" # ~/.bashrc eval "$(direnv hook bash)" # ~/.config/fish/config.fish direnv hook fish | source
設定後はシェルを再起動(または source ~/.zshrc)してください。
基本的な使い方
.envrc を作成する
プロジェクトのルートに .envrc を作成します。
# .envrc export DATABASE_URL="postgres://localhost:5432/myapp_dev" export API_KEY="your-api-key" export NODE_ENV="development"
direnv allow で有効化する
.envrc を作成しただけでは読み込まれません。セキュリティのため、明示的に許可が必要です。
direnv allow # direnv: loading .envrc # direnv: export +API_KEY +DATABASE_URL +NODE_ENV
以後はそのディレクトリに入るたびに自動で読み込まれます。
.envrc を編集する
.envrc を変更するたびに direnv allow が必要です。
# エディタで編集した後 direnv allow
direnv edit . を使うとエディタで開いて保存時に自動で allow されます。
direnv edit .
無効化する
direnv deny # そのディレクトリの .envrc を無効化 direnv revoke # 許可を取り消す
よく使うパターン
.env ファイルを読み込む
.env ファイルが既にある場合は .envrc から読み込めます。
# .envrc dotenv
.env ファイルの内容が環境変数として展開されます。.env を .gitignore に追加し、.envrc だけをGit管理する運用がよく使われます。
# .gitignore .env # .envrc はコミットする(シークレットを直接書かない)
PATHにディレクトリを追加する
# .envrc PATH_add bin # ./bin を PATH に追加 PATH_add ./node_modules/.bin
PATH_add はdirenv組み込みのヘルパー関数で、絶対パスに変換してPATHに追加します。
プロジェクトごとのPythonバーチャル環境を自動で有効化する
# .envrc source .venv/bin/activate
ディレクトリに入ると .venv が有効になり、出ると無効になります。
別ファイルの環境変数を読み込む
# .envrc source_env ../.env.shared # 親ディレクトリの共有設定 dotenv .env.local # ローカル専用の設定
条件分岐
# .envrc if [ -f ".env.local" ]; then dotenv .env.local else dotenv .env fi
miseとの連携
miseとdirenvを組み合わせると、ディレクトリごとに言語バージョンと環境変数を両方自動で切り替えられます。
# .envrc use mise # .tool-versions のバージョンをdirenvで管理 export DATABASE_URL="postgres://localhost/myapp"
use mise はmiseが管理するバイナリをPATHに追加します。
セキュリティの仕組み
direnvは .envrc を変更するたびに allow の再実行を求めます。これは悪意のある .envrc が意図せず実行されることを防ぐためです。
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
このメッセージが出たときは .envrc の内容を確認してから direnv allow を実行します。
許可状態の確認
direnv status
direnv exec path /path/to/project Found RC path /path/to/project/.envrc Found RC allowed true ...
まとめ
| 操作 | コマンド |
|---|---|
| .envrc を有効化 | direnv allow |
| .envrc を編集して有効化 | direnv edit . |
| 無効化 | direnv deny |
| 状態確認 | direnv status |
| .env を読み込む | .envrc に dotenv を書く |
| PATHを追加 | .envrc に PATH_add bin を書く |
direnvを使うと source .env の手動実行や、プロジェクトを切り替えるたびに環境変数を手で設定し直す手間がなくなります。.envrc をGit管理し、シークレットは .env(gitignore済み)に分離するパターンが実用的です。
Pythonのバーチャル環境(venv)との組み合わせは「Pythonのバージョン管理:pyenv・miseの使い方と切り替え方法」を参照してください。
miseによるNode.jsのバージョン管理は「Node.jsのバージョン管理:mise・nvm・Volta・asdf・nodenvの使い方」を参照してください。
miseによるRubyのバージョン管理は「Rubyのバージョン管理:rbenv・miseの使い方と切り替え方法」を参照してください。