OrePAN的なやり方でモジュール管理していたプロジェクトのcarton化を進めているので、進捗をメモしてみる。
整合性が取れるまでcarton installを進める
現状のモジュールのバージョンを完全に固定したままで、carton installしたらあまりうまく行かなかった。プロジェクトにはテストがかなりあるので、まあ全部バージョン上がっても良いとして、carton installする。テストを走らせてみて、バージョンを固定しないと動かないようなモジュールはcpanfileに記述していった。
$ carton install $ # なんかおかしかったらcpanfileを編集 $ carton install
cpanfileには以下の様な形でモジュールを固定していった。
requires 'HTTP::Message' => '<= 6.02';
またinstallが終わった後はcarton checkをして、状況をチェックしていった。
まだ解決していないモジュールとしてImager, Imager::File::PNG, LWP::UserAgentなどがある。
Imagerはlibpngが入っている時勝手にImager::File::PNGをインストールするが、Makefile.PLでImager::File::PNGはno_indexされている。このため
requires 'Imager'; requires 'Imager::File::PNG';
としていたときに、Imager::File::PNGの情報がcpanfile.snapshotに記録されず、carton checkするとImager::File::PNGがインストールされていないと言われてしまう。とりあえずrequires 'Imager::File::PNG'を消せば問題は解決するが、解決方法として妥当ではないとは思う。
LWP::UserAgentに関してはTest::Mock::LWPがno_indexを使わずにpackage LWP::UserAgentと書いてしまっているため、cpanfile.snapshotに書かれるversionが0.01になってしまう。そのため入っているversionが不整合が起こっていると言われる。これはまだ解決していない。
carton bundleする
色々終わったらcarton bundleしてcpan mirrorを作っておく。この時、vendor/bin/cartonにfatpackされたcartonが置かれるので、その後は基本的にはこのcartonを用いることにする。ただしこのcartonは手元のcpanmのversionを使ってfatpackされている(?)ようなので注意する。
モジュールインストールのpathを変えてみる
ここまで出来た後、モジュールのインストールパスを変えてもうまく動くのかどうか、bundleしたmirrorからインストールがうまくいくかどうか試してみた。
carton install --pathでインストール先を変えられるし、PERL_CARTON_PATHでexecするときにインストールしたディレクトリを指定することが出来る。
$ vendor/bin/carton install --cached --path local-carton $ PERL_CARTON_PATH=local-carton vendor/bin/carton exec prove t/
テストが通るまで試した。
carton execしてもglobalなperlに入っているモジュールも参照してしまう
carton execしてもglobalなperlに入っているモジュールも参照してしまうというのにちょっとハマった。
$ carton exec -- perl -e 'print join "\n", @INC' ~/development/myprojects/perl/prepan/local/lib/perl5/darwin-2level ~/development/myprojects/perl/prepan/local/lib/perl5 ~/.plenv/versions/5.16.3/lib/perl5/site_perl/5.16.3/darwin-2level ~/.plenv/versions/5.16.3/lib/perl5/site_perl/5.16.3 ~/.plenv/versions/5.16.3/lib/perl5/5.16.3/darwin-2level ~/.plenv/versions/5.16.3/lib/perl5/5.16.3
のようになり、cartonでインストールしたモジュールがなくても、グローバルに入れていたら使われてしまうようだった。
https://github.com/miyagawa/carton/issues/60 このへんが関連してる。
carton 1.1辺りでcoreのみにするオプションが入るかもしれないらしい。https://github.com/miyagawa/carton/issues/110
まとめ
まだまだcarton化への道は長い。