« Cache::Redisってのを書いたら意外と大変だった件 | メイン | Redis::LeaderBoardっての書いてた »

2013年6月 5日

cpanfileのrequiresにURLを直接指定するのは好ましくない

cpanfileでは、requires "git:..."; のように、gitやtarballのURL等を指定すれば cpanm --installdeps . でモジュールがインストールできる「裏ワザ」があることが 結構知られているようです。しかし、これは好ましくありません。そもそも CPAN::Meta::Spec準拠ではありません。

これはあくまでcpanm側が第1引数にgitやtarballのURLなどを指定すればよしなに インストールしてくれるから現状は「偶然」そういう動きになっているだけです。

(cpanm git:...でインストールできるので、requires "git:..."; って書いてあれば 入れてくれてしまうってことです。)

あくまでインストールにcpanmを使った場合に動くってだけの限定的な話で、しかも今後は 動かなくなる可能性が高いです。

実際問題、requires $any_url; としてしまうと、モジュールのバージョン比較とか ができずに、毎回愚直にdownloadしてきてインストールし直すようになってしまうの で、これは色々嬉しくない。

じゃあどうするのか

現状、requires "Module::Name", "1.01", git => "git:...";などと書けるように する仕様が話しあわれています。

なので、そのあたりの仕様が固まるまで待ちましょう。

待ってられないなら、OrePAN2とかでcpan mirrorを立てよう

とは言えそんなに悠長に待ってられないって話もあるでしょう。実際問題、CPANに上がって ないけど、gitから入れたいってことはままあるかとおもいます。

その場合は、CPANに上がっていないモジュールをOrePAN2でcpan mirror運用しましょう。 OrePAN2の使い方はググって下さい。

OrePAN2を使うと、git URLから簡単にcpan mirror形式のディレクトリを作れるので、 それをそのままローカルで使ってもいいし、どっかで静的ファイル配信してもいい。 gitで共有してもいい。楽チンです。

cpan mirrorを使ってモジュールをインストールする方法はcpanmとcartonでそれぞれ 以下の様な感じです。なんかmirrorのみ指定だと依存モジュールとかが上手く入らない ようです。

% cpanm --mirror=http://cpan.metacpan.org/ --mirror=http://oreore/orepan/ --installdeps .
% PERL_CARTON_MIRROR=http://cpan.metacpan.org/,http://oreore/orepan/ carton install

今の職場だと、Arkをそういう感じで運用していたりします。OrePANで今年運用 始めたんだけどそしたらいきなりOrePAN2が出てきてだいぶタイミング悪かった感ある。

Arkのrepoの.travis.yml を見るとそのへん色々頑張ってるな!っていうのが伺えます。

そういや、Arkのリポジトリをいつの間にか移動させてました。しかしそろそろCPANにあげたいですね。クリスマス辺りには上がるんじゃないですかね。

投稿者 Songmu : 2013年6月 5日 23:15