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コマンドの相性問題ということ?

環境:

個人的にはRubyWindowsかって言ったら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