今日のcarton進捗情報です。
今日はcarton checkをしてみたら、正しくインストールされているはずなのに、versionがおかしいと怒られてしまったのでその調査をしました。
carton checkで怒られる原因
まずcarton checkをしてみると、
$ carton check Following dependencies are not satisfied. LWP::UserAgent has version 0.01. Needs 6.04 Run `carton install` to install them.
のようにおこられました。しかし、carton installしても変化がありません。
調べてみると、cpanfile.snapshotのTest::Mock::LWPのところに以下のような記述がされていました。
Test-Mock-LWP-0.06 pathname: L/LU/LUKEC/Test-Mock-LWP-0.06.tar.gz provides: HTTP::Request 0.01 HTTP::Response 0.01 LWP::UserAgent 0.01 Test::Mock::HTTP::Request 0.01 Test::Mock::HTTP::Response 0.01 Test::Mock::LWP 0.06 Test::Mock::LWP::UserAgent 0.01 requirements: ExtUtils::MakeMaker 0 Test::MockObject 1.08 Test::More 0.42
ここにLWP::UserAgentやHTTP::Requestなどが0.01として記述されているせいで、0.01がインストールされていると認識されてしまっているようです。またこのようになっている理由は、このdistributionの中で
package LWP::UserAgent; # ...
のようにLWP::UserAgentの中身を書き換えているせいのようです。
解決法
外からいい感じにする方法がわからなかったので、今回はこのモジュールに対してpull reqを送ることにしました。解決するにはCPAN::Meta::Specの仕様に合わせてno_indexを適切に利用するか、hide from PAUSE hackというのをするかどちらかの必要があるようです。おそらくはそれさえも平凡な日々: CPANで意図しない名前空間の取得を防ぐためになどが参考になります。
Module::Installの場合
https://metacpan.org/module/ADAMK/Module-Install-1.06/lib/Module/Install.pod#no_index のように設定をします。今回の場合だったらMakefile.PLに以下のように記述して、
no_index package => 'HTTP::Request'; no_index package => 'HTTP::Response'; no_index package => 'LWP::UserAgent';
そしてperl Makefile.PLします。ちなみにModule::Installには暗黙的にauthor modeというのとend user modeというのがあるようで、なんかいい感じにしないとMETA.ymlが更新されずにはまりました。make realcleanを先にやっておくといいみたいです。
$ make realcrean
$ perl Makefile.PL
$ cat META.yml # no_index packageに記述されていた大丈夫
hide from PAUSE hackする場合
これはpackage記述の後に改行を入れておくと、providesに入らない挙動を利用したhackです。今回だったらそれぞれのところを以下の様な記述に差し替えます。
package # hide from PAUSE
LWP::UserAgent;
minillaの場合
ちなみにminillaの場合はminil.tomlに記述してminil releaseするだけです。簡単ですね。確認はminil dist経由で出来ます。
minil.tomlに以下を記述。ちなみにここでno_indexを記述したい場合はdefaultのno_index directoryの記述を追加しておくほうが良いです。
[no_index] directory = ['t', 'xt', 'inc', 'share', 'eg', 'examples', 'author', 'builder'] package = ['LWP::UserAgent', 'HTTP::Request', 'HTTP::Response']
あとはminil distして確認してminil releaseする。
$ minil dist $ # .tar.gzが出来るはずなので、その中のMETA.ymlを確認 $ minil release
Module::Bulidの場合
調べてないです。
まとめ
こんなかんじで今回はちゃんと入っているはずのモジュールがcarton checkでこけた時の問題の一つを調べてみました。今のところ少し壊れているdistributionを外からなんとかする方法が見つからなかったので、pull req送って解決したりしてました。メンテナンス放棄しているモジュールとかだとどうしようもない感じもするので、何かしらうまく出来るといいですね。
ログ
@moznion Module::Installについて詳しくないですか
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 残念な事に Module::Install あまり詳しくないです……
— moznion (@moznion) 2013年10月15日
@moznion 残念、no_index周りの挙動がわけわからなくてMinillaにしたいけど他人のモジュールで困ってる...
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 OSSですか?
— moznion (@moznion) 2013年10月15日
@moznion https://t.co/KNgctvEexV これがLWP::UserAgentとかHTTP::Requestに対してindex貼ってしまっているから、no_indexしたいだけなのでした
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 これ、index張ってるんですか?
— moznion (@moznion) 2013年10月15日
@shiba_yu36 use package, or use "# hide from PAUSE" hack http://t.co/YUnhhk3mLw
— Tatsuhiko Miyagawa (@miyagawa) 2013年10月15日
@moznion @shiba_yu36 i guess cpanm will pick it up for carton
— Tatsuhiko Miyagawa (@miyagawa) 2013年10月15日
@miyagawa yes, I add "no_index package => 'LWP::UserAgent';" to Makefile.PL, and exec "perl Makefile.PL",
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@miyagawa but there is not no_index package in META.yml, so I'm confused...
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 https://t.co/vXfFZnw3Ff これをUserAgent.pm に書けば行けそうです
— moznion (@moznion) 2013年10月15日
@moznion それでもいけそう、なんとなくちゃんとMakefile.PLに書いたほうがいいかなと思ったけど、大変だしこっちにするか
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 Makefile.PLに書くなら、内包しているモジュールを別ファイルに切り出す必要がありそうな気が
— moznion (@moznion) 2013年10月15日
@moznion no_index packageセクションじゃ無理ってこと?
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@moznion http://t.co/uD9DO42sTf これとか見るとno_index packageしたらいいだけかと思っていた
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 because you're running it as a user mode. rm -fr inc and run it and you'll get META.yml regen
— Tatsuhiko Miyagawa (@miyagawa) 2013年10月15日
@miyagawa oh, i see, I try it.
— 柴崎優季 (@shiba_yu36) 2013年10月15日
あー、make realcleanしてperl Makefile.PLしないといけなかったのかー
— 柴崎優季 (@shiba_yu36) 2013年10月15日
@shiba_yu36 Module::Install has author mode/user mode and it's really consufing
— Tatsuhiko Miyagawa (@miyagawa) 2013年10月15日