初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

plenvを使ってみた.

追記: plenvのバージョンアップに伴い, 「続・plenvを使ってみた」という記事を書きました.

@さんがplenvという, Perl 5のインストール管理ツールを開発されたそうです.
ブログ記事やREADMEをまとめてみると, plenvの特徴は...

  • Rubyのrbenvから影響を受けている.
  • perlbrewと違って, プロダクトごとにperlのバージョンを指定することができる.
  • とても高速で, インストールも簡単.
  • perlbrewのような機能を持つが, 完全な上位互換ではない.

...という感じっぽい.
こういう時はグダグダ言わずに入れて試してみるに限る, というわけでさっそく導入してみましょうー!

インストール

plenvを導入する為にはCPAN/homebrew/gitを使う方法がありますが, 今回はgitを使って入れてみます.
ただ特徴にも書いてあるとおり, どの方法を使うにせよインストールはとても簡単です.

$ git clone git://github.com/tokuhirom/plenv.git ~/.plenv
$ echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.zshrc

githubから落としてきて, パスを通す.
これでOKです. とっても簡単ですね!
あとは初期設定さえしてしまえば, plenvを使うことができます.

$ echo 'eval "$(plenv init -)"' >> ~/.zshrc

plenvは'~/.plenv/shims/'にパスを通す必要があるので, 上記コマンドでパスを通します.
このコマンドは, 下記のコマンドとほぼ等価です

$ echo 'PATH=~/.plenv/shims:$PATH' >> ~/.zshrc

...注意事項としては, これを手動で.zshrcに書き込むときには, 必ず'~/.plenv/shims'を'$PATH'の前に書くようにしましょう.
最初, '$HOME'を一番最初に書いたので, しばらく詰まって*1ました...

使い方

perlのインストール

$ plenv available
perl-5.17.8
perl-5.16.2
perl-5.14.3
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07

今使える(インストール可能な)perlのバージョンを表示します.
ちなみにperlbrewのように, インストール済みのバージョンはマークされないようです.

$ plenv install 5.16.2

perl-5.16.2をインストールします.
ちなみに, 'perl-5.16.2'と書いても同じように動くようです.

デフォルトのperl, ローカルのperl

最初, 特徴で「(plenvは)perlbrewと違って, プロダクトごとにperlのバージョンを指定することができる.」と書きました.
plenvは, 以下の順番で使用するperlを決定します.

  1. 環境変数'PLENV_VERSION'
  2. 今のディレクトリか, 上位ディレクトリのローカル設定('.perl-version')
  3. グローバル設定('~/.plenv/version')
  4. システムのperl

次のコマンドで, 3.の「グローバル設定」を変更することができます.
この場合, perl-5.16.2をデフォルトで使用するperlに設定します.

$ plenv global 5.16.2

一方, 2.の「ローカル設定」は, 次のコマンドで設定できます.

$ plenv local 5.10.1

このコマンドを実行することで, カレントディレクトリに'.perl-version'という名前のファイルが生成されます.
ちなみに'.perl-version'も'~/.plenv/version'もテキストファイルで, 中身はコマンドで指定したperlのバージョン('5.16.2'とか'5.10.1'とか...)が書かれているだけなので, 多分手動で書き換えることもできます.

それでは, 'グローバル設定'と'ローカル設定'を使って, perlのバージョンを使い分けてみましょう.
いつもは最新のperl-5.16.2で作業しているが, 開発している一部のプロダクトはperl-5.10.1上で動かしているので, これらを使い分ける... という例を考えてみます.

perlbrewの場合, switchコマンドでいちいち切り替える必要がありました.
しかしplenvでは, perl-5.10.1で動かす必要があるプロダクトのディレクトリ内でローカル設定を行なってしまえば, これらの切り替えを自動的に行うことができます.

グローバル設定がperl-5.16.2になっている状態で, perl-5.10.1で動かしたいプロダクトがあるdev/hogeディレクトリでローカル設定を行うと...

$ cd ~/dev/hoge
$ plenv local 5.10.1
$ perl -v

This is perl, v5.10.1 (*) built for i686-linux

    ....

このように, 自動的にperl-5.10.1が呼び出されます.
一方, ホームディレクトリに戻ってperlを実行すると, グローバル設定をもとにperl-5.16.2が呼び出されます.

$ cd ~
$ perl -v

This is perl, v5.16.2 (*) built for i686-linux

    ....

perlbrewと違って, 使用するperlのバージョンを設定ファイルで決定できるというのは, plenvの一つの強みと言えるのではないでしょうか.

導入済みのperl一覧(2013/01/23 追記)

"list"で導入済みのperlを確認することができます.

$ plenv list
  5.10.1
* 5.16.2
  system

現在有効なバージョンの前には"*"が付くようです.
この辺は, perlbrewと同じですね.

別名でのインストール(2013/01/25 追記)

インストール時に'as'オプションを付けることで, バージョンの代わりに任意の名前を与えることができます.

$ plenv install 5.16.2 --as=app

この場合, perl-5.16.2をappという名前でインストールすることになります.
同じバージョンのperlを複数インストールしたい場合*2に使えそうです.

インストール時に与えられた名前は, バージョンの代わりに使用することができます.
listで導入済みのバージョンを表示すると, 次のように表示されます.

$ plenv list
  5.10.1
* 5.16.2
  app
  system

また, 与えられた名前はグローバル設定やローカル設定の為に使うこともできます.

$ plenv global app
$ plenv local app

cpanm

perlbrewと同じく, cpanmを導入することもできます.

$ plenv install-cpanm

現在使われているperlにcpanmをインストールします.

モジュールの移動

plenvを使えば, 異なるバージョンのperl間でモジュールを移動することができるようです.
例えば, あるプロダクトの開発環境をperl-5.10.1から新しくインストールしたperl-5.12.5に変更するような場合, perlbrewならば必要なモジュールをperl-5.12.5に入れなおす必要があります.
しかし, plenvの場合, migrate-modulesを使うことであるバージョンにインストールされているモジュールを別のバージョンに移動することができます.

$ plenv migrate-modules 5.10.1 5.12.5

まとめ

簡単ではありますが, plenvを紹介してみました.
@さんも仰っている通り, plenvはperlbrewの完全な上位互換ではありません.
ただ, perlbrewでできる事はほとんどplenvでできますし, 実行するperlのバージョンをファイルで設定できる点や,バージョン間のモジュール移動が簡単な点などは, お仕事(実務)でperlを使う上で便利な機能だと思います.
というわけで, しばらくplenvを使ってみようと思います!

*1:plenvを無視して, 必ずシステムのperlが呼び出されてしまう.

*2:ビルド時のオプションを変える, とか...