ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

direnvを使う

最近なぜかdirenvが流行っているようでよく耳にする。direnvは今どき注目されるようでもないような気がするが、非常に便利なツールだ。

Pythonにpyenvやvirtualenvwrapper、Rubyにrbenv、PHPにphpenvの様に「*env」を別々に使っている方、それが不便で全てを統合したラッパ「anyenv」を使っている方がもしdirenvを知らない時のために記事にしておく。

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)


direnvは簡単に言うと、「ディレクトリに環境を割り当てるツール」で、「環境を割り当てる」とは単純にディレクトリによって環境変数を切り替えるツールになる。

例えば特定のディレクトリにcdすると、そのディレクトリに設定されている環境変数を自動的に読み込む。その環境にPythonRubyPHPの環境を指定したり設定を指定しておくことで、そのディレクトリ配下では自動的にその設定が適応されるというものになる。

例えば、virtualenvを使っていると切り替え忘れで悩むことがあるが、自動的に切り替えるようにしておけばこのミスがなくなる。

よって、バージョン以外にも環境変数で操作できるものであればdirenvで全て調整できるものになる。例えば、プログラムから環境変数を読み込むようにしておき、ディレクトリの環境変数にアカウント情報を設定しておけば、ディレクトリに応じて自動的にアカウントが変更される。

これは素晴らしい。

direnvのインストール

direnvはUbuntuのパッケージには含まれていないので自分でビルドする必要がある。ビルド後のファイルは単一になるのでインストールは簡単だ。

まず、direnvはgoで書かれているので、go関連のパッケージをインストールしておく必要がある(以下はUbuntu14.04での作業)。

% sudo apt-get install golang

そして、これでビルドの準備が整ったのでソースのダウンロードとビルド。

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

これで完了。goなのでビルド時間も非常に短く素晴らしい。goいいよ。go。

direnvを使う設定

direnvは上に書いたように「ディレクトリに移動したら環境変数を切り変える」と言う超魔術的な手法を利用しているので、シェルにその超魔術を設定しておく必要がある。単純に言えばコマンドが実行されるとディレクトリの移動かチェックするためにフックするというものだ。

zsh

私はzshを利用しているため、「~/.zshrc」に以下を追加しておく。

eval "$(direnv hook zsh)"

bash

bashを利用していないため動作確認はしていないが、bashでも同じように「~/.bashrc」に以下を追加する。

eval "$(direnv hook bash)"

他のシェルでも同じような設定で行けるかと思う。

これで設定は完了。

使い方

環境変数を変更したいディレクトリ内で以下のコマンドを実行する。

direnv edit .

これでシェルに設定しているエディタが立ち上がるので、このディレクトリで変更、追加する環境変数を書いておく(もちろんdirenvを使って、ディレクトリに応じてエディタを変更することもできる。すばらしい。)。編集した設定は「.envrc」として保存される。

export PATH=$PWD/bin:$PATH

こんな感じで環境変数を追加できる。


そして、例えばvirtualenvを使うにはこうする。これはマニュアルを読んだ使い方ではなく自分で勝手にやってることなので正しくないかもしれない。詳しくはマニュアルを参照されたし。

% mkdir .direnv
% virtualenv .direnv/virtualenv --python /usr/bin/python3.4

これで好きな環境を作っておく。そしてこのvirtualenvを自動的に使うように設定する。

% cat .envrc
use_python() {
echo "Python $1"
}
use python 3.4
layout python

これで自動的に設定されるようになる。

% cd ..
direnv: unloading

% python --version
Python 2.7.6

% cd foo
direnv: loading .envrc
direnv: using python 3.4
Python 3.4
direnv: export +VIRTUAL_ENV ~PATH

% python --version
Python 3.4.0


これは渋い。正しいやり方を知ってる方がいれば教えて下さい。

初めてのPython 第3版

初めてのPython 第3版

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

エキスパートPythonプログラミング

エキスパートPythonプログラミング

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング