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
しかし、pyenv
はPython専用です。
プログラミング言語ごとに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
を使いましょう!