SSJB's blog

いろいろです。

Bash on Ubuntu on Windows で cpanm が使えないのを解決できた

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

。。。ダメだ…

upgdate してみる

cpan> upgrade

上手くいかない。。。
CPAN が機能していない、というよりも、Bash on Ubuntu on Windows がおかしいのではないか…?

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 を使ったほうがよさそう。。。