Rake::Win32.rake_system
これは/lib/rake/win32.rbにあるsystem()のWindows用ラッパーである。
内容は以下の通り。
# Run a command line on windows. def rake_system(*cmd) if cmd.size == 1 system("call #{cmd}") else system(*cmd) end end
cmd.size != 1 ならばそもそもラップする意義もないシンプルなものだ。
ただこれを使うとRuby1.9ではrakeが動かない。
- ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
- 入力行が長すぎます。
のどちらかになる。
ちゃんとした境界は不明(調べるのめんどい)だが、コマンド行がある程度長いと後者のエラーになるようだ。
対策としては、
- Rake::Win32.rake_system()を呼ばない
これで滞りなく動く。
もっと小さく切り分けると、
- if cmd.size == 1 の節を実行しない。つまりcallコマンドを使わない。
まぁそうするとそもそもこのメソッドは無意味になるので、rake_system()を使わずに
直接system()呼ぶのと変わらないのだけど。
ちなみに、Ruby1.8.7ではもちろん普通に動くし、双方のRakeライブラリで(この件に関しては)違うことをしているわけではない。
Ruby1.9のsystemの実装とcallコマンドの相性問題ということ?
環境:
- ruby 1.9.1p0 (2009-01-20 revision 21700) [i386-mswin32]
- ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
個人的にはRubyかWindowsかって言ったらRubyの肩を持ちたいので、callコマンドが悪い! と決め付けてパッチ当てます。
--- rake.rb.bak Wed Jan 28 23:05:20 2009 +++ rake.rb Wed Jan 28 23:06:07 2009 @@ -983,11 +983,12 @@ end def rake_system(*cmd) - if Rake::Win32.windows? - Rake::Win32.rake_system(*cmd) - else - system(*cmd) - end + #if Rake::Win32.windows? + # Rake::Win32.rake_system(*cmd) + #else + # system(*cmd) + #end + system(*cmd) end private :rake_system