direnvは.envrcを1個しか読まない、階層があっても勝手に合成されない

  • direnv
  • Shell

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

direnvって複数階層に.envrcがあったら勝手にカスケードして合成してくれると思ってたけど、違った。

挙動

direnvはデフォルトでは、実行時に現在のディレクトリから上に向かって最初に見つかった.envrcを1つだけロードする。親ディレクトリにも.envrcがあっても、子の.envrcと自動で合成されるわけじゃない。

~/projects/.envrc # HF_TOKEN とか共通の値を書いてる
~/projects/app/.envrc # ここで作業してる

この状態で~/projects/appに入っても、~/projects/.envrcは読み込まれない。~/projects/app/.envrcだけが評価される。

親も引き継ぎたい場合

子の.envrcの中で明示的にsource_upを呼ぶ。

~/projects/app/.envrc
source_up
export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxx

source_upは親ディレクトリを辿って最初に見つかった.envrcを読み込んでから、自分の内容を追加する動き。親に.envrcが無いとエラーになるので、無くてもいいならsource_up_if_existsを使う。

つまり

  • .envrcは自動連鎖しない、明示しないと繋がらない
  • 共通の環境変数を上位階層に置きたいなら、下位の.envrcにsource_up(かsource_up_if_exists)を書くのが前提
  • 今の階層で何が読み込まれてるか怪しいときはdirenv edit .で確認するのが早い