plenvというツールを利用すると、ユーザー環境にPerlをインストールすることができます。システム標準のPerlを利用したくない場合や新しいバージョンのPerlを利用したい場合は便利です。またplenvを使うと複数のバージョンのPerlの切り替えを行うことができます。
plenvのインストール
plenvをインストールしてみましょう。前提として、plenvをインストールするにはgitがインストールされている必要があるので注意してください。
以下のコマンドを実行します。
git clone git://github.com/tokuhirom/plenv.git ~/.plenvgit 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_profileecho '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などエラーがでた場合は、以下の記事を元に、フィックスをこころみましょう。
- [https://qiita.com/DQNEO/items/890b99134be0ad81d174:title=[対処法] 599 Internal Exception, https://fastapi.metacpan.org/v1/release/_search]
- want to check Mozilla :: CA
どうしてもうまくいかない場合は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
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って環境ごとに、何らかの差分があることがほとんどなので、移植性を保たせてもあんまりメリットがないということもあります。