plenv - ユーザー環境にPerlをインストールする



  1. Perl




  2. モジュール



  3. here

plenvというツールを利用すると、ユーザー環境にPerlをインストールすることができます。システム標準のPerlを利用したくない場合や新しいバージョンのPerlを利用したい場合は便利です。またplenvを使うと複数のバージョンのPerlの切り替えを行うことができます。

plenvのインストール

plenvをインストールしてみましょう。前提として、plenvをインストールするにはgitがインストールされている必要があるので注意してください。

以下のコマンドを実行します。

git clone git://github.com/tokuhirom/plenv.git ~/.plenv
git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/

次にplenvのパスを通しましょう。plenvで用意されているbash用の設定ファイルを「.bash_profile」に追加します(bashの場合)。

以下のコマンドを実行してください。

echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(plenv init -)"' >> ~/.bash_profile
exec $SHELL -l

ユーザー環境へのPerlのインストール

利用できるPerlの一覧を見てみましょう。

plenv install -l

うまくplenvがインストールされていると、インストール可能なPerlの一覧が表示されます。

Available versions:
 5.29.1
 5.29.0
 5.28.0
 5.28.0-RC4
 5.28.0-RC3
 5.28.0-RC2
 5.28.0-RC1
 ...

ここで、599 Internal Exceptionなどエラーがでた場合は、以下の記事を元に、フィックスをこころみましょう。

どうしてもうまくいかない場合はperlbrewで。

ユーザー環境にPerlをインストールします。5.20.3のPerlをインストールしてみましょう。時間がかかるので待ちます(約40分程度)。

plenv install 5.20.3

利用可能なPerlの一覧を表示してみましょう。

plenv versions

Perlが利用できると

以下のように利用できるPerlが表示されます。アスタリスクのあるものが現在利用しているPerlです。

* system (set by /home/kimoto2/.plenv/version)
  5.20.3

Perlを切り替えるにはplenvのglobalコマンドを使用します。

plenv global 5.20.3

plenvの利点としてlocalコマンドを使うと、ディレクトリ毎にPerlを切り替えることもできるようです。

Perlのバージョンを実際に確認してみましょう。

perl -v

以下のように5.20.3のバージョンになっています。

This is perl 5, version 20, subversion 3 (v5.20.3) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)

cpanmのインストール

モジュールをインストールするのに便利なcpanmもインストールしておきましょう。

plenv install-cpanm

これで以下のコマンドでモジュールがインストールできるようになります。

cpanm JSON

元のPerlに戻す

元のPerlに戻すには以下のようにします。

plenv global system

plenvでインストールしたPerlをcrontabで使う方法

plenvのはまりどころのひとつは、plenvでインストールしたPerlがcronからは利用されないということでしょう。これはcronから実行するときは、シェルが起動されないので.bash_profileが読み込まれないことが原因です。plenvによる設定は、.bash_profileの中に記述したからですね。

一番簡単な解決策は、crontabの中でPATHを、そのユーザーが持っている環境変数PATHの値に書き換えてあげることです。

まずplenvをインストールしたユーザーで、PATH環境変数の値を表示します。

env | grep PATH

PATHを含んだ環境変数がいくつか表示されるので、PATHというものを探します。(ユーザー名がadminsの場合の例です。)

PATH=/home/kimoto2/.plenv/shims:/home/kimoto2/.plenv/bin:/home/kimoto2/.plenv/shims:/home/kimoto2/.plenv/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/kimoto2/.local/bin:/home/kimoto2/bin:/home/kimoto2/.local/bin:/home/kimoto2/bin:/home/kimoto2/.local/bin:/home/kimoto2/bin

以下のコマンドでcrontabを編集します。

crontab -e

そして上記のPATHの値をcrontabの一番上に書き込みます。

PATH=/home/kimoto2/.plenv/shims:/home/kimoto2/.plenv/bin:/home/kimoto2/.plenv/shims:/home/kimoto2/.plenv/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/kimoto2/.local/bin:/home/kimoto2/bin:/home/kimoto2/.local/bin:/home/kimoto2/bin:/home/kimoto2/.local/bin:/home/kimoto2/bin

# cronの設定が続く...

これでcronが指定したバージョンのPerlを利用してくれるようになります。

Perlスクリプトの一行目の記述

Perlスクリプトの一行目の記述は以下のようenvコマンドを使った記述をしましょう。

#!/usr/bin/env perl

こうすると設定したPATHの値から自動的にperlを検出してくれます。

この方法は、見てのとおり、crontabの移植性がまったくないです。ユーザー名のkimoto2が直接埋め込まれています。

でもこの方法が一番よいと思います。その理由はcrontab内では、環境変数の変数展開ができないという制限があるので、うまく移植性を持たせることが難しいということが理由です。移植性を持たせると、記述量が多くなったり、追加のスクリプトが必要になったり、管理が煩雑になってしまいます。

それとどんなにがんばっても、crontabって環境ごとに、何らかの差分があることがほとんどなので、移植性を保たせてもあんまりメリットがないということもあります。