リロケータブル Perl

tl;dr

github の release ページ からすきな場所に置けば使える perl がダウンロード可能

リロケータブル perl って?

通常 perl は build 時に モジュールの読み込み path (@INC) を決定するため、インストール後 perl のディレクトリを移動するとモジュールが読み込めなくなり、使い物にならなくなる。

Can't locate strict.pm in @INC (you may need to install the strict module) (@INC contains: ...)

しかしながら実際は -Duserelocatableinc オプションを指定しbuild すれば、 @INC は perl binary の相対path で管理されるようになるため、インストール後 perl の directory を移動しても問題なく動作するようなる。

先のエントリー で このリロケータブル perl が使い物になるかどうか考えていたが、いくつか adhoc な修正をすれば使えそうだとの結論に達した。

試す

github の release ページmaclinux の リロケータブルで build した perl を置いた。

例えば mac の場合...

> wget https://github.com/shoichikaji/relocatable-perl/releases/download/0.2/perl-v5.20.0-darwin-2level.tar.gz
> tar xzf perl-v5.20.0-darwin-2level.tar.gz
> mv perl-v5.20.0-darwin-2level ~/my-favorite-name

でよい。なんと簡単か!

本当に使えるか試す。

> ~/my-favorite-name/bin/perl -v
This is perl 5, version 20, subversion 0 (v5.20.0) built for darwin-2level

> ~/my-favorite-name/bin/cpanm -nq LWP::UserAgent
...
Successfully installed libwww-perl-6.07
15 distributions installed

> ~/my-favorite-name/bin/lwp-download http://www.cpan.org
Saving to 'index.html'...
7.79 KB received

misc

どんなときに有用か
  • perl に詳しくない人に単にダウンロードすれば使えるものを準備するのは重要
  • 誰にとっても毎度 perl を build するのは面倒なので、ダウンロードすれば使えるのはいい
  • あるサーバで動く perl アプリケーションが複数あるとき、それぞれに relocatable perl複数コピーし使用すれば管理を別にできる。
  • perl でアプリケーションを書いたとき、perl も bundle して配布できればインストールコストは格段に下がり使ってくれる人が増えると思う。 1つの試みとして perl + GrowthForecast でこれをやってみた。https://github.com/shoichikaji/relocatable-perl-growthforecast
plenv と一緒に使いたい

plenv は ~/.plenv/versions 以下に入っている perl を管理するだけなのでそこに置けばいい。

> wget https://github.com/shoichikaji/relocatable-perl/releases/download/0.2/perl-v5.20.0-darwin-2level.tar.gz
> tar xzf perl-v5.20.0-darwin-2level.tar.gz
> mv perl-v5.20.0-darwin-2level ~/.plenv/versions/hoge
> plenv versions
* 5.18.2 (set by /Users/skaji/.plenv/version)
  ...
  hoge
> plenv global hoge
> plenv versions
  5.18.2
  ...
* hoge (set by /Users/skaji/.plenv/version)
自分で relocatable perl を build したい

実際、知らない人が build したものを使うべきでないし、自分で build するべき。 https://github.com/shoichikaji/relocatable-perl に手順が書いてある。

まとめ

  • -Duserelocatableincperl を build すれば、perl はどこに置いてもつかえるようになる。
  • relocatable で build した maclinux 用の perlgithub の release ページ に置いた。
  • relocatability で perl の可能性が広がるとおもってる。
  • 公式に relocatable perl を配布してもらいたい。