

direnvは.envrcを1個しか読まない、階層があっても勝手に合成されない
この記事は、構成と文章の整理に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を呼ぶ。
source_up
export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxsource_upは親ディレクトリを辿って最初に見つかった.envrcを読み込んでから、自分の内容を追加する動き。親に.envrcが無いとエラーになるので、無くてもいいならsource_up_if_existsを使う。
つまり
.envrcは自動連鎖しない、明示しないと繋がらない- 共通の環境変数を上位階層に置きたいなら、下位の
.envrcにsource_up(かsource_up_if_exists)を書くのが前提 - 今の階層で何が読み込まれてるか怪しいときは
direnv edit .で確認するのが早い