$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

carton化を進めています

 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化への道は長い。