pyenvオワコン、direnv最強

社内勉強会で発表しようと思ったけど、寿司の運搬という重大任務を仰せつかって、流れてしまったスライドを転載

(なお原稿では乱立する"***env"をマスコミは「目があって角が2本」としか認識していない国民的ロボットシリーズに、 anyenvをそれらを合体させたプラモ作例、 direnvを白くて角が1本のシンプルなデザインな新作に例えましたが、 大人の事情で削除しています。)

pyenvはawesome

Pythonには、プロジェクトそれぞれに専用の環境を作ってPythonのバージョンやライブラリを切り替えることができる、virtualenv, virtualenvwrappperというツールがあります。 Rubyなどの他の言語にも、virtualenvのようなツールがあります。

しかし、プロジェクトごとの環境を切り替えるたびに、いちいち切り替えコマンド(workon)を叩くのは面倒です。

pyenvはあらかじめディレクトリに環境を紐付けておくと、ディレクトリにcdしたとき、勝手に環境を切り替えてくれます。

$ # ~/foo ディレクトリでは、python 3.4.1を使う
$ cd ~/foo
$ pyenv local 3.4.1

$ # 移動すると、自動でpythonが切り替わる
$ cd ~/foo
$ python --version
Python 3.4.1

これで「小1時間悩んだ挙句、別のPythonで実行していた事に気づき(ry」ということは無くなります。

はっきり言って、革命的です、life-changingです。

pyenvには指定したバージョンのPythonインストールする機能もありますが、割愛します)

乱立する ***env

しかし、pyenvPython専用です。

プログラミング言語ごとにrbenv phpenv ndenv jenv denv luaenvなどがありますが(ちなみにrbenvが***envの元祖らしいです)、どれもやることはほとんど同じです。

同じなのに、別々のツールになっているとはこれ如何に?

そして、新しい言語が登場したらまた***envを作らなければならないのでしょうか?

anyenvは解決策か?

***envを一元的に管理するための、anyenvというツールもあります。

しかし、ただ寄せ集めただけという感じがします。

また、各***envの間でコードが重複している問題や、新しい言語が登場したらまた***envを作らなければならない問題は解決しません。

direnvこそが真の解決策

そこでdirenvです

direnvはディレクトリごとに環境変数を設定するツールです。

Python含む多くの言語は、環境変数を切り替えれば、プロジェクト環境も切り替えられるのです。 言語処理系以外のツールの切り替えにも、汎用的に使えるでしょう。

また、言語ごとに use_python(Pythonのバージョンを宣言)、layout python(virtualenv環境を作ることを宣言)といったショートカットコマンドもあるので、***envより手間が増えるということもありません。

つまり、direnv*envの上位互換な後継ツール**なのです。

これからはdirenvを使いましょう!

追記:direnvで解決するGOPATHの3つの問題点 - None is None is None