渋谷の片隅で吠える

エンジニアをしています。主にscalaとjavaを書いています。

direnvでエレガントな開発環境を

direnvとは

ディレクトリごとに環境変数を定義してカレントディレクトリになった時に環境変数を適用してくれるツール。

Githubはこちら
https://github.com/direnv/direnv

Goでできててなうい感じ。 ドキュメントも充実してます。

インストール

Mac上でHomeBrewをいれているときはbrew install direnv

そうじゃない人は

git clone https://github.com/direnv/direnv.git
cd direnv
sudo make install

これでインストールは完了

hookの追加

.zshrcや.bashrcにhookを追加する。

export EDITOR=vim(ここはお気に入りのエディタに読み替えてください)
eval "$(direnv hook zsh)"

bashの場合は

eval "$(direnv hook bash)"

pathを通して環境を作る

環境構築したいディレクトリに移動して

direnv edit .

とすると記載のためのエディタが立ち上がるので、そこに

export PATH=bin:$PATH

を追加する。

PATH_add bin

こっちでもできます。

保存が完了すると.envrcができているので追加があるときは編集してください。

エラーが発生する

.envrcが読まれると時たまエラーが出ます。そんなときは

direnv allow

として問題解決

direnvを使うメリット

pvmとかpyenvとか色々管理ツールはあるわけですが管理ツールの管理に追われるというジレンマに陥りがち。

あれ、何が原因で動かないんだ?ってなった時に.envrcを見に行ってごにょごにょするだけでいいなら楽チンです。 僕はplayFrameworkの管理がきっかけで使うようになりました。 play1.2.7を使う時にjava7使わないといけなかったり他ではscala使ったりjava8つかったりしてる関係でとても重宝しています。

これで余計な労力を使わずエレガントな環境構築と変更が可能です。

おまけ

alias

.direnvrcを開いて

export_function() {
local name=$1
local alias_dir=$PWD/.direnv/aliases
mkdir -p "$alias_dir"
PATH_add "$alias_dir"
local target="$alias_dir/$name"
if declare -f "$name" >/dev/null; then
echo "#!/usr/bin/env bash" > "$target"
declare -f "$name" >> "$target" 2>/dev/null
echo "$name" >> "$target"
chmod +x "$target"
fi
}

を書き込む。

hoge() {
 こまんど
}
export_function hoge

こちらで議論してます。参考にどうぞ https://github.com/direnv/direnv/issues/73