四 月
19
水曜日

direnvでディレクトリ毎に設定を切り替える

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.

というエラーメッセージが表示される。
有効化はdirenvallowサブコマンドによって行う。

direnv allow .

また同様にdenyサブコマンドで無効化することもできる。

なお有効状態の管理は~/.config/direnv/allow ディレクトリ配下で管理されている。
direnvpruneサブコマンドは不要になった状態ファイルを削除する。

git管理下にならないように気をつける

.envrc は使い方によっては機密情報等が含まれる可能性もある。誤ってgitの管理下とならないようにグローバルなgit ignoreに追加しておく。

~/.config/git/ignoreに以下を追加。

.envrc

階層構造

.envrcsource_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