direnv とは
direnvはディレクトリごとに異なる環境を設定できるツールです。direnvを使用することで、ディレクトリに移動するたびに、そのディレクトリに対して指定された環境変数、エイリアス、コマンド、シェル関数を自動的に設定することができます。これにより、プロジェクトごとに必要な環境を簡単に切り替えることができます。
direnvは.envrcというファイルを使用して、ディレクトリに対する環境を設定します。.envrcファイルは、direnvがcdコマンドで移動したときに読み込まれ、そのディレクトリに対する環境を設定します。
以下は.envrcファイルの例です。
# environment variable
export MY_VAR=example_value
export PATH=$PWD/bin:$PATH
# alias
alias ll='ls -l'
# shell function
function my_function() {
echo "Hello, World!"
}
この例では、MY_VARという環境変数を定義し、$PATHに$PWD/binを追加しています。また、llというエイリアスを定義し、my_functionというシェル関数を定義しています。このように、プロジェクトごとに異なる環境を簡単に設定できます。
direnv の使い方
direnvの使い方を紹介します。
インストール
Macの場合はbrewコマンドで簡単にdirenvをインストールすることができます。
$ brew install direnv
direnvのインストール後、シェルにhookを追加します。bashの場合は次のコマンドを実行します。
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc
allow
direnv allowコマンドで.envrcファイルを読み込みます。
例えば/my-projectディレクトリで次のような.envrcファイルを作成します。
export TEST=test
次のコマンドを実行します。
$ direnv allow
direnv: loading ~/my-project/.envrc
direnv: export +TEST
/my-projectディレクトリ下ではTESTという環境変数が設定されるようになります。
$ echo $TEST
test
/my-projectディレクトリから移動するとdirenvがアンロードされます。
$ cd ..
direnv: unloading
TESTという環境変数の設定が解除されていることが分かります。
$ echo $TEST
その他のコマンド
direnvはallowコマンド以外にいくつかのコマンドが存在します。詳細はdirenv --helpコマンドで確認することができます。
$ direnv --help
direnv v2.32.2
Usage: direnv COMMAND [...ARGS]
Available commands
------------------
allow [PATH_TO_RC]:
permit [PATH_TO_RC]:
grant [PATH_TO_RC]:
Grants direnv permission to load the given .envrc or .env file.
block [PATH_TO_RC]:
deny [PATH_TO_RC]:
revoke [PATH_TO_RC]:
Revokes the authorization of a given .envrc or .env file.
edit [PATH_TO_RC]:
Opens PATH_TO_RC or the current .envrc or .env into an $EDITOR and allow
the file to be loaded afterwards.
exec DIR COMMAND [...ARGS]:
Executes a command after loading the first .envrc or .env found in DIR
fetchurl <url> [<integrity-hash>]:
Fetches a given URL into direnv's CAS
help [SHOW_PRIVATE]:
shows this help
hook SHELL:
Used to setup the shell hook
prune:
removes old allowed files
reload:
triggers an env reload
status:
prints some debug status information
stdlib:
Displays the stdlib available in the .envrc execution context
version [VERSION_AT_LEAST]:
prints the version or checks that direnv is older than VERSION_AT_LEAST.
.env と.envrc を併用
docker-composeや dotenv では.envというファイルにより環境変数を設定します。
.envと.envrcを併用したい場合に、次のような方法で環境変数の2重管理を避けることができます。
環境変数の定義は.envに書きます。
API_KEY=xxxxxxxxxxxxxxxxxxxx
.envrcにdotenvと記述すると、.envrcで.envに定義されている環境変数を参照することができます。
dotenv
ファイル名が.envではない場合は次のようにパスを指定することもできます。
dotenv ./.env.development
venv と.envrc を併用
direnvをPythonのvenvと併用することで、プロジェクトディレクトリへ移動したときに仮想環境をactivateし、そのディレクトリを抜けると自動でdeactivateさせることができます。
まずはPythonの仮想環境を作成します。
$ cd my-project
$ python -m venv venv
プロジェクトディレクトリ配下に次のような.envrcを作成します。
source venv/bin/activate
export PYTHONPATH=${APP_HOME}
export HOGE='HOGE'
export FUGA='FUGA'
対象のディレクトリに移動すると仮想環境がactivateされます。
$ cd my-project
direnv: loading ~/Projects/my-project/.envrc
direnv: export +BAR +FOO ~PYTHONPATH
(venv)$
ディレクトリを抜けると仮想環境がdeactivateされます。
(venv)$ cd ..
direnv: unloading
$
参考