Traffine I/O

日本語

2023-02-17

direnv

direnv とは

direnvはディレクトリごとに異なる環境を設定できるツールです。direnvを使用することで、ディレクトリに移動するたびに、そのディレクトリに対して指定された環境変数、エイリアス、コマンド、シェル関数を自動的に設定することができます。これにより、プロジェクトごとに必要な環境を簡単に切り替えることができます。

direnvは.envrcというファイルを使用して、ディレクトリに対する環境を設定します。.envrcファイルは、direnvがcdコマンドで移動したときに読み込まれ、そのディレクトリに対する環境を設定します。

以下は.envrcファイルの例です。

.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ファイルを作成します。

.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に書きます。

.env
API_KEY=xxxxxxxxxxxxxxxxxxxx

.envrcdotenvと記述すると、.envrc.envに定義されている環境変数を参照することができます。

.envrc
dotenv

ファイル名が.envではない場合は次のようにパスを指定することもできます。

.envrc
dotenv ./.env.development

venv と.envrc を併用

direnvをPythonのvenvと併用することで、プロジェクトディレクトリへ移動したときに仮想環境をactivateし、そのディレクトリを抜けると自動でdeactivateさせることができます。

まずはPythonの仮想環境を作成します。

$ cd my-project
$ python -m venv venv

プロジェクトディレクトリ配下に次のような.envrcを作成します。

.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

$

参考

https://github.com/direnv/direnv

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!