carton での imager を扱う際の悩み

lingr で聞いたところなかなか悩ましい感じだったので、一応メモとして、、、

前提

  • Imager
    • imager は install する時に gif, png, jpeg のライブラリがあれば一緒に入れる。なかったら入れない。
  • Imager::File::PNG みたいな別 dist も一応ある

cpanfile を

requires 'Imager';
requires 'Imager::File::PNG';

とする。

cpanm . --installdeps

  • libpng がない状態で cpanm . --installdeps した場合は Imager は error にならずに、Imager::File::PNG はエラーになる
  • libpng がある状態だと、 Imager で ::PNG も一緒に入り、requires 'Imager::File::PNG'; の箇所は up to date となる。

結果として libpng があれば大丈夫

carton install

requires 'Imager::FIle::PNG' も書く場合

  • libpng がない状態で carton install した場合は Imager は error にならずに、Imager::File::PNG はエラーになる
  • ある状態で、Imager がまだ入ってない状態だと Imager を install したタイミングで ::PNG も一緒に入り requires 'Imager::File::PNG'; は up to date となる。
    • この状態だと Imager::File::PNG の install.json は作られないので cpanfile.snapshot には記録されない
    • carton check を行うと cpanfile と cpanfile.snapshot に差異が出るので通らない

requires 'Imager::File::PNG' を書かずに requires 'Imager' だけの場合

  • libpng がない状態だと Imager::File::PNG が存在しない。 carton check に問題は起きないが png file を扱おうとすると死ぬ
  • libpng がある状態なら問題なし
    • あるなしに関わらず Imager の install は上手く行き、carton check は通るが、png file が扱えるかどうかが扱うまで分からない。

期待したい状態

  • Imager::File::PNG が carton に正しく入っていて、それを carton check で確認出来る。

現状の妥協案

  • setup する server とかは chef とかでちゃんと管理するから libpng とかが存在するとみなして、requires 'Imager::File::PNG' は書かない。
  • jenkins では carton exec -- prove -lvt t する前に carton installcarton check をする
  • use_ok Imager::File::PNG を書いておく。( 手元とかでも入ってなかったら気づける )