LoginSignup
3
2

More than 3 years have passed since last update.

概要

本記事では環境変数をディレクトリごとに管理できるdirenvについて解説し、複数台マシンを持っていたりマシンの交換の際にその環境変数を共有する方法を説明します。

direnvを使うメリット

  • .bashrc.zshrcがスッキリする
  • 複数のプロジェクトで環境変数の名前を出し分けられる
  • 指定のディレクトリ以下でしか環境変数が定義されないため、export -lが綺麗になる

使い方

背景(問題)

仕事用PCの環境構築をしており、mysqlサーバの構築にvagrantdockerを使った方法を採用しました。

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ファイルを置き、

.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にはそれぞれのプロジェクトでのみ通したいパスを定義します。

今回の僕のパターンだと、

home
export DOCKER=192.168.50.10
project1
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にあげておけば更に楽になると思います!

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2