結構昔からあるツールなので、ご存知な方、すでに使ってる方が多いかもしれません。私も7〜8年くらいは使ってる気がします。最近色々な*rcを整理していて、direnvrcも触る機会があったので紹介します。
direnv
ディレクトリ毎に環境変数を切り替えられるツールです。.envrc
か.env
で環境変数をexportしておくことで、ディレクトリに移動したらこの環境変数をロード、ディレクトリから出たらアンロードします。
インストール
それぞれのOS毎にパッケージを用意してくれています。macOSだとHomebrewからインストールするのが簡単そうです。インストールが完了すると、自分が使ってるシェルに合わせてhookを仕込む必要があるかもしれません。
ちなみに、私は以前紹介したasdfからインストールしています。
asdf plugin add direnv asdf install direnv latest asdf global direnv latest
使ってみる
とりあえず、実験用のディレクトリを作ります。
mkdir test cd test
.envrcに環境変数を記述していきます。
echo 'export AWS_PROFILE=test' >> .envrc
もし、うまくセットアップができているとdirenv: error /path/to/.envrc is blocked. Run `direnv allow` to approve its content
のようなメッセージがでてきます。このままで.envrcは読み込まれないのでdirenv allow
を実行して、.envrcを有効化してください。無事に読み込まれると以下のようなメッセージが出力されます。
direnv: loading ~/test/.envrc direnv: export +AWS_PROFILE
echo $AWS_PROFILE
をして、正しく読み込まれているか確認してみてください。
こんな感じで簡単に使い始めることができます。
少し凝った使い方をしてみる
direnvは~/.config/direnv/direnvrc
に記述された関数を使うことができます。私の設定をいくつか紹介します。
# {{{ AWS use_aws() { export AWS_PROFILE="$1" export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key) } use_local_aws_config() { local dir="$PWD/.aws" install -Ddvm0700 "$dir" export AWS_CONFIG_FILE="$dir/config" [[ -f "$AWS_CONFIG_FILE" ]] \ || install -m0600 /dev/null "$AWS_CONFIG_FILE" export AWS_SHARED_CREDENTIALS_FILE="$dir/credentials" [[ -f "$AWS_SHARED_CREDENTIALS_FILE" ]] \ || install -m0600 /dev/null "$AWS_SHARED_CREDENTIALS_FILE" use_aws default } # }}} # {{{ GCP use_gcp() { export CLOUDSDK_ACTIVE_CONFIG_NAME="$1" export USE_GKE_GCLOUD_AUTH_PLUGIN=True } # }}} # {{{ K8s use_local_kubeconfig() { local dir="$PWD/.kube" install -Ddv "$dir" export KUBECONFIG="$dir/config" } # }}}
~/.config/direnv/direnvrc
にこのように定義しておいて、作業ディレクトリの.envrc
では、定義された関数を読み込んで使っています。
# そのプロジェクトがAWSを使う場合 use_aws <profile-name> # そのプロジェクトがGCPを使う場合 use_gcp <config-name> # そのプロジェクトがK8sを使う場合 use_local_kubeconfig
use_local_*
は作業ディレクトリに.aws
を作ったり、.kube
を作ったりしてそこからロードします。
まとめ
ディレクトリ毎に環境をわけたい時はdirenvが便利だと思います。関数を定義しておくことで、決まった処理を他の環境でも同じように記述できるようになります。もし、この機能を使っていない方は、ぜひ使ってみてください。