direnv入門:ディレクトリごとに環境変数を自動で切り替える

スポンサーリンク

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 を読み込む .envrcdotenv を書く
PATHを追加 .envrcPATH_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の使い方と切り替え方法」を参照してください。