2013年3月18日
carton execでTest::mysqldが起動できなくて泣いた
% carton exec -Ilib — prove -lv t/mysqld.t
*** mysqlinstalldb failed ***
Can’t locate lib/core/only.pm in @INC (…
結論から言うと、carton execしたperlと別バージョンのperlがどこかで使われて、 そのPerlにlocal::lib(lib::core::only)が入っていないと死ぬ。
Test::mysqldだと、mysql_install_db
っていうMySQLのコマンドをキックしている
んだけど、それが実はperlスクリプトで、/usr/bin/perlってshebangに書かれていて
System perl前提にしているのだけど、それにlocal::libが入っていないとコケる。
Carton:CLI#cmd_execの中でPERL5OPTを以下のようにセットしているんだけど、 それが配下のプロセスにグローバルに影響を与えてしまうのが原因。
local $ENV{PERL5OPT} = "-Mlib::core::only -Mlib=$lib";
とりあえず手元では sudo cpan local::lib
して凌いだ。cpanコマンドとか何年ぶり
だろうかw
perlで書かれてSystem perl前提にしているコマンドをキックしているような場合に 軒並み動かない可能性があるので場合によっては困りそう。
根本的な解決は難しそうだなーという気はしているんだけど、とりあえず、 issueあげておいた。
該当のperlにlocal::lib入れれば解決するので、同様の現象で悩んでいる人も いるかもしれないのでとりあえずblogった。
local::libがperl coreに入れば徐々に解決といえば解決ではある。
3/18 23:45 追記:
@kazuho @songmu this is a known issue and I may have to rewrite it without using PERLOPT
— Tatsuhiko Miyagawaさん (@miyagawa) 2013年3月18日
ということで、既知の問題で修正を考えているとのことです。なんかこうmiyagawaさんから反応あるとすごく嬉しいですね!