MinGWに加えてGit for WindowsStrawberry Perl、DevKit付きのRubyInstallerと、MinGWがいっぱい入ってる。こういう環境だとStrawberry PerlのセットアップでPATH環境変数にld.exeとかがあるフォルダーへのパスを追加される(または追加する必要がある)のがコンフリクトの原因になってとても厄介。どうせもうcpanmしか使わないので、そのラッパー書いてRubyInstallerのDevKitとRubyGemの挙動に似たような感じにごまかすことにしたメモ。

RubyInstallerのDevKitとRubyGemはうまく出来ていて、DevKitをインストールするとRubyGemでインストール系のコマンドを使う時にだけPATHにDevKitのフォルダーを追加してくれるようになっている(んだと思う)。優先してPATHに追加されるので、かなりコンフリクトに強い。というかMinGWは使うときにだけPATHに追加するのが王道だと思うので、こっちの方が素直な利用法な気がする。

@echo off

echo Temporary enhancing PATH to include build tools...
cmd /c set PATH=C:\strawberry\c\bin;%PATH% && C:\strawberry\perl\bin\cpanm.bat %*

これをcpanmw.batなどとしてパスの通った所に置いておくだけ。Windowsのパス管理の仕様上、cpanm.batとしてそれを使わせようとするのは茨の道なので止めておいた方が良い。

C:\> cpanmw JSON::XS

全ての引数をそのまま渡すのでcpanmコマンドと使い方は同じ。

このままだと例えばLWP::UserAgentでhttpsにアクセスする場合とかにDLLがなくて怒られるので、dmake.exeld.exeとかがあるフォルダーにあるDLLファイルをperl.exeがあるフォルダーにコピーするという荒業でごまかしている。他にも不具合ありそうだけど、特定のモジュールがうまく動かないかcpanmでのユーザー領域へのモジュールのインストールが失敗するくらいだと思うので、あまり環境がぶっ壊れる感じにはならないんじゃないかと思う。