Bash on Ubuntu on Windows を試していたところ、cpanm でPerlモジュールをインストールすると、謎のエラーが発生。
その解決策。
cpanm がすんなり入らなかった
$ curl -L https://cpanmin.us | perl - --sudo App::cpanminus
上手く入らず、エラーが発生。
ここで気付いていればよかったのですが、面倒だったので apt-get でやってしまいました。
$ sudo apt-get install cpanminus
上手く入りました。
モジュールのインストール
JSON を入れてみます。
$ cpanm JSON --> Working on JSON Fetching http://www.cpan.org/authors/id/M/MA/MAKAMAKA/JSON-2.90.tar.gz ... OK Configuring JSON-2.90 ... OK Building and testing JSON-2.90 ... FAIL ! Installing JSON failed. See /home/suprsonicjetboy/.cpanm/work/1476965938.6921/build.log for details. Retry with --force to force install it.
FAIL!!!
ログを見ると、(一部抜粋)
# Failed test 'use JSON;' # at t/00_load.t line 8. # Tried to use 'JSON'. # Error: Can't locate JSON/backportPP.pm in @INC (you may need to install the JSON::backportPP module) (@INC contains: /home/suprsonicjetboy/.cpanm/work/1476965938.6921/JSON-2.90/blib/lib ......) at (eval 7) line 2. # at t/00_load.t line 8. # Compilation failed in require at t/00_load.t line 8. # BEGIN failed--compilation aborted at t/00_load.t line 8. Files=58, Tests=207, 5 wallclock secs ( 0.12 usr 0.31 sys + 1.45 cusr 2.23 csys = 4.11 CPU) Result: FAIL Failed 40/58 test programs. 3/207 subtests failed. make: *** [test_dynamic] エラー 255 -> FAIL Installing JSON failed. See /home/suprsonicjetboy/.cpanm/work/1476965938.6921/build.log for details. Retry with --force to force install it.
どうやら、JSON/backportPP.pm が上手く入らないようですが、JSON/backportPP.pm は直接入れられません。
JSON/backportPP.pm はJSON モジュールに含まれているからです。
$ cpanm JSON::backportPP ! Finding JSON::backportPP on cpanmetadb failed. ! Finding JSON::backportPP () on mirror http://www.cpan.org failed. ! Couldn't find module or a distribution JSON::backportPP
the JSON distribution will include JSON::backportPP for backwards computability.
http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm#note
パスが通っていない?
間違っていなく通したはず。。。
$ export PERL_CPANM_OPT="--local-lib=~/perl5" $ export PATH=$HOME/perl5/bin:$PATH; $ export PERL5LIB=$HOME/perl5/lib/perl5:$PERL5LIB; $ echo $PERL_CPANM_OPT --local-lib=~/perl5 $ echo $PATH /home/suprsonicjetboy/perl5/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games $ echo $PERL5LIB /home/suprsonicjetboy/perl5/lib/perl5:
CAPN で入れてみる
$ cpan JSON
。。。ダメだ…
issues
とりあえず、issue を探してみます。
github.com
これっぽい。
github.com
$ sudo vim /usr/lib/perl/5.18.2/Config.pm
94行目。
デフォルトが、dont_use_nlink => undef になっているので、dont_use_nlink => 'define' に変更。
違うissueもありました。
github.com
こっちは、undef を 1 にします。
'define' でも 1 でも、true になればOK。
true はないけど。
一応、ドキュメントには、1 とあります。
File::Find - search.cpan.org
解決
$ cpanm JSON --> Working on JSON Fetching http://www.cpan.org/authors/id/M/MA/MAKAMAKA/JSON-2.90.tar.gz ... OK Configuring JSON-2.90 ... OK Building and testing JSON-2.90 ... OK Successfully installed JSON-2.90 1 distribution installed
原因?
Ubuntu on Windows のファイルシステムの問題っぽい?
dont_use_nlink に関係する気になる issue がありました。
File::Findで再帰的に検索できない問題。
github.com
$ perl -e 'use File::Find;find(sub {print $File::Find::name,$/;},".");'
解決策として、これも、dont_use_nlink => 'define' の設定で改善するとのこと。
もしかすると、このあたりのタイミングで修正されたのかもしれません。
Build 14901
Fixed
Added mount and unmount for tmpfs, procfs and sysfs file systems
Bash on Ubuntu on Windows - Release Notes
つまり
Vagrant / VirtualBox を使ったほうがよさそう。。。