[Mac] perlbrewでERROR: Failed to retrieve patchperl executable.が出たときの対処
Mac上でのperlbrewで"ERROR: Failed to retrieve patchperl executable"というエラーが出たので回避策をメモします。 どうやら、MacPortsからインストールしたwgetに関連するエラーのようで、これを使わないようにすることでエラーを回避できました。
エラーのログ:
$ \curl -L http://install.perlbrew.pl | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 315 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0
100 1020 100 1020 0 0 175 0 0:00:05 0:00:05 --:--:-- 3763
## Download the latest perlbrew
## Installing perlbrew
perlbrew is installed: ~/perl5/perlbrew/bin/perlbrew
perlbrew root (~/perl5/perlbrew) is initialized.
Append the following piece of code to the end of your ~/.zshenv and start a
new shell, perlbrew should be up and fully functional from there:
source ~/perl5/perlbrew/etc/bashrc
Simply run `perlbrew` for usage details.
Happy brewing!
## Installing patchperl
ERROR: Failed to retrieve patchperl executable.
perlbrew本体のインストールは出来ているものの、その先のpatchperlのインストールで失敗しているようです。以下のやりとりをみると、どうやらMacPortsからインストールしたwgetがよろしくないようです。
"Installing perlbrew on OS X Mavericks (10.9.1) and macports"
http://stackoverflow.com/questions/20921886/installing-perlbrew-on-os-x-mavericks-10-9-1-and-macports
SSL証明書関連の問題かと思い、wget側でもcurlがみている証明書を参照するようにしたのですが、どうやら違う模様。
対処
方法その1
MacPortsのactivate, deactivateを使って、一時的にwgetを使わないようにする方法です。
(1) MacPortsのdeactivate
コマンドでwgetをオフにしておきます。
$ sudo port deactivate wget
Password:
---> Deactivating wget @1.14_5+ssl+universal
---> Cleaning wget
(2) 次に、さきほどインストールしたperlbrewを一旦削除して、クリーンな状態に戻しておきます。
$ rm -rf ~/perl5/perlbrew
(3) ここでperlbrewをインストールします。今度はうまくいきました。
$ \curl -L http://install.perlbrew.pl | bash
... (中略)
Happy brewing!
## Installing patchperl
## Done.
(4) MacPortsを元に戻しておきます。
$ sudo port activate wget
---> Computing dependencies for wget
---> Activating wget @1.14_5+ssl+universal
To customize wget, you can copy /opt/local/etc/wgetrc.sample to /opt/local/etc/wgetrc and then make changes.
---> Cleaning wget
方法その2
方法1だと、perlbrewから何かインストールする度にwgetをdeactiveにする必要があります。スクリプトを作ってしまうのも手ですが、以下のエントリをみると、wgetとfetchの定義を削ればいいようです。wgetが無くても動くことは方法1で分かっているので、perlbrewを編集してみます。
「さくらのレンタルサーバに perlbrew」
http://www.naney.org/diki/d/2013-09-23-perlbrew.html
(1) perlbrewのバックアップを取る
cd ~/perl5/perlbrew/bin
cp perlbrew perlbrew.bak
(2) perlbrewを編集する
適当なエディタでperlbrewを開きます。8行目あたりにやたらと長い1行が出てくるため、表示がうまくいかない場合は折り返しをオフにするといいでしょう。(vimの場合は:set nowrap)
次のような箇所を探します。
my%commands=(curl=>{test=>'--version >/dev/null 2>&1',get=>'--silent --location --fail -o - {url}',download=>'--silent --location --fail -o {output} {url}' },wget=>{test=>'--version >/dev/null 2>&1',get=>'--quiet -O - {url}',download=>'--quiet -O {output} {url}',},fetch=>{test=>'--version >/dev/null 2>&1',get=>'-o - {url}',download=>'{url}' });sub http_user_agent_program {...
上記のwgetとfetchの定義箇所を削除して保存します。 (※ただし、cpanmとpatchperlで試した限りでは、fetchの定義を削らなくてもエラーにはなりませんでした。どうやらwget固有の問題のようですが、念のためfetchも定義から除外しておきます。)
これでcpanmも無事インストールできました。
perlbrew install-cpanm
cpanm is installed to
/Users/succzero/perl5/perlbrew/bin/cpanm
余談
wgetを無効にしない状態では、cpanmに関してはperl -d
で実行するとうまくインストールされます。ただし、patchperlについては以下のissueのように-d
の有無によらず失敗します。
"perlbrew fails to install patchperl"
https://github.com/gugod/App-perlbrew/issues/350
perl -d
のログ:
$ perl -d ./perlbrew.bak install-cpanm
Loading DB routines from perl5db.pl version 1.39_10
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(./perlbrew.bak:564): my $app = App::perlbrew->new(@ARGV);
DB<1> r
/Users/succzero/perl5/perlbrew/bin/cpanm already exists, are you sure to override ? [y/N] [N] y
cpanm is installed to
/Users/succzero/perl5/perlbrew/bin/cpanm
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.