リロケータブル 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 ページ に mac と linux の リロケータブルで 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 に手順が書いてある。