概要
本記事では環境変数をディレクトリごとに管理できるdirenv
について解説し、複数台マシンを持っていたりマシンの交換の際にその環境変数を共有する方法を説明します。
direnv
を使うメリット
-
.bashrc
や.zshrc
がスッキリする - 複数のプロジェクトで環境変数の名前を出し分けられる
- 指定のディレクトリ以下でしか環境変数が定義されないため、
export -l
が綺麗になる
使い方
背景(問題)
仕事用PCの環境構築をしており、mysqlサーバの構築にvagrant
とdocker
を使った方法を採用しました。
DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる
https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484#docker-for-mac%E3%81%B8%E3%81%AEmutagen%E3%81%AE%E9%81%A9%E7%94%A8
この方法を採用してmysqlにアクセスする場合、http://192.168.50.10:3306
にアクセスすることになります。
プロジェクトのデータベースの設定ファイルには
development: {
...
host: process.env.DB_HOSTNAME || '127.0.0.1',
...
},
test: {
...
host: process.env.TEST_DB_HOSTNAME || '127.0.0.1',
...
}
と書いてあり、環境は合計4つあったため、最低4つの環境変数を設定しなければいけない状況になりました。
もし、他の設定もデフォルト値から変更しなければ行けない場合、変更する設定×4の環境変数を設定する必要があり、このままでは.zshrc
や.zshenv
がごちゃついてしまいます。
解決策
direnv
で管理すれば簡単です。
まずは、brew
経由でインストールします。他の方法でも問題ありません。
brew install direnv
使い方は簡単で、ディレクトリに.envrc
ファイルを置き、
export YOUR_ENV=your_env_xxx
このように書いて、
derenv allow
その後、shellを起動し直すと.envrc
を置いたディレクトリ配下にのみ環境変数が出来ようされます。
応用
環境変数をディレクトリで出し分けるのを各マシンで書いたり、買い替えたあとにやり直すのは面倒だと思います。
そこで、githubのプライベートリポジトリに登録して簡単に設定できるようにしてしまいましょう!
僕の場合はホームディレクトリの.zshrc
, .tmux.conf
等を管理しているリポジトリで.direnv
ディレクトリも管理するようにしました。
$HOME/.direnv
の中はこのようにします。
.direnv
├── home
└── project1
└── project2
home
にはホームディレクトリ以下で通したいパスを、project1
, project2
にはそれぞれのプロジェクトでのみ通したいパスを定義します。
今回の僕のパターンだと、
export DOCKER=192.168.50.10
DB_HOSTNAME=${DOCKER}
TEST_DB_HOSTNAME=${DOCKER}
のように作ります。その後、
# .envrcという名前で適用したいディレクトリへのシンボリックリンクを作成
ln -s $HOME/.direnv/home $HOME/.envrc
ln -s $HOME/.direnv/project1 $HOME/your/project1/directory/.envrc
# direnvを適用
direnv allow
# shellを再起動
exec $SHELL -l
これでどのPCでも同じ環境変数を使えるようになりました!
もし同じディレクトリ構成で作るならMakefile
に上のコードを書いてあげてgithubにあげておけば更に楽になると思います!