direnvはCUI上における環境変数切換ツールでディレクトリへ進入、退出をトリガに任意の環境変数を追加、削除することができる。
bash、zsh、tcsh、fish shellに対応している。
セットアップ
インストール
Homebrewでインストール。
brew install direnv
Fish shell用設定を追加
Fish shellを利用している場合は ~/.config/fish/config.fish
にdirenvのフックを定義する。
# direnv
eval (direnv hook fish)
envrcについて
作成
ディレクトリ直下に .envrc
ファイルを配置しておくと当該ディレクトリへ進入した際に自動的に実行される。
例えば~/example/.envrc
を以下のように作成することでディレクトリ配下でのgitコマンドを利用した際、AUHTORとCOMMITERは常にfoo
となる。
NAME="foo"
MAIL="foo@example.com"
export GIT_COMMITTER_NAME=$NAME
export GIT_COMMITTER_EMAIL=$MAIL
export GIT_AUTHOR_NAME=$NAME
export GIT_AUTHOR_EMAIL=$MAIL
また注意点として.envrcはカレントシェルの種類にかかわらず常にbashで記述する必要がある。 これはdirenvが.envrcをbashサブシェルとして実行し そこでexportされた環境変数をカレントシェル側へ反映しているため。
有効/無効
.envrc
を作成、編集した後.envrc
は一旦無効状態となる。この状態でディレクトリへ進入すると
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
というエラーメッセージが表示される。
有効化はdirenv
のallow
サブコマンドによって行う。
direnv allow .
また同様にdeny
サブコマンドで無効化することもできる。
なお有効状態の管理は~/.config/direnv/allow
ディレクトリ配下で管理されている。
direnv
のprune
サブコマンドは不要になった状態ファイルを削除する。
git管理下にならないように気をつける
.envrc
は使い方によっては機密情報等が含まれる可能性もある。誤ってgitの管理下とならないようにグローバルなgit ignoreに追加しておく。
~/.config/git/ignore
に以下を追加。
.envrc
階層構造
.envrc
でsource_up
関数を呼び出す事により、ディレクトリ階層を遡った直近の.envrc
を連鎖して実行することができる。
この機能により例えば ~/example/.envrc
にexampleワークスペース共通の環境変数を定義。
~/example/projects/foo/.envrc
にプロジェクトfoo固有の環境変数を定義するといった階層的な管理を行うことができる。
例) ~/example/.envrc
NAME="foo"
MAIL="foo@example.com"
export GIT_COMMITTER_NAME=$NAME
export GIT_COMMITTER_EMAIL=$MAIL
export GIT_AUTHOR_NAME=$NAME
export GIT_AUTHOR_EMAIL=$MAIL
例) ~/example/projects/foo/.envrc
source_up
export APP_API_TOKEN=xxxxxxxxxxx