Masteries

技術的なことや仕事に関することを書いていきます.

direnvは環境変数の上書きもよしなにやってくれる!

direnv, 常日頃から愛用していて, これまでは「新しい環境変数のセット(export TEST=test)」しかできないと思っていたんですけど, 今日試していたらなんと

export PATH=/path/to/tool:$PATH

みたいな, 環境変数の上書きもいい感じにやってくれる事が判明したので, 忘備録的にメモしておきます.

解説

こういうディレクトリ構成があるとして,

parent
|-- child
    |-- .envrc

childディレクトリの.envrcの中身は次のようになっているとします.

export TEST=this_is_$TEST

このとき, parentディレクトリで, 次のようにして環境変数TESTをセットします.

$ export TEST=test
$ echo $TEST
test

この状態で, cdchildディレクトリに移動すると…

$ cd child
direnv: loading .envrc
direnv: export ~TEST

こうなり, echoコマンドで環境変数TESTの中身を表示すると…

$ echo $TEST
this_is_test

.envrcで指定したように, this_is_が先頭に付くように上書きされます. さらにここから, cd ..childディレクトリを抜け…

$ cd ..
direnv: unloading

echoコマンドで環境変数TESTの中身を確認すると, なんと環境変数TESTの中身は元通りに戻っています.

$ echo $TEST
test

ユースケース

諸事情あって, 複数のバージョンのMySQLをHomebrewで管理して使い分けている時, 例えばあるアプリケーションではMySQL 5.6を使うようにしたいのであれば, そのアプリケーションのルートに.envrcを置いて,

export PATH=/usr/local/opt/mysql@5.6/bin:$PATH

と書いておけば良さそうで, こうすればこのアプリケーションの開発環境ではmysqlコマンドなどで5.6のものを優先して使ってくれるようになります. brew linkbrew unlinkを駆使して, Homebrewで利用するMySQLのバージョンを切り替える必要がなくなって, 楽そうな感じがします.

加えて, MySQLのサーバはDockerを利用して立ち上げるようにすれば, ミドルウェアの管理がかなり楽に, かつ柔軟に(アプリケーションごとに最適なものを選べるように)なりそうです.