Windows環境におけるlibxml-ruby gemインストール時のrake
先日、Windowsで、ActiveSupportのXMLパーサをLibXMLに切り替える方法について書きましたが、その判断に至る経緯についてメモしておきます。
ActiveSupportのXMLパーサの実装をLibXMLに変更できない件(2)の最後の方で書いていますが、XMLパーサがnilとなってしまうのは、libxml-rubyのインストール時のrakeが正しく実行されていないのが原因ではないかと思っています。
rake
libxml-ruby gemをインストールするとできるlibxml-ruby-0.9.7-x86-mswin32-60フォルダにRakefileがある。そこで、とりあえず、rakeを実行。
tarがないというエラーになる。
tar zcvf libxml-ruby-0.9.7.tgz libxml-ruby-0.9.7 'tar' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 rake aborted! Command failed with status (1): [tar zcvf libxml-ruby-0.9.7.tgz libxml-ruby...]
Windowsでtarを実行できるようにしよう。vectorから、tar32230.zipダウンロード。解凍。tar32.dllがあるフォルダtar32_2にパスを通す(tar32.dllをC:\Windows\system32に移動してもよい)。また、vectorからtar11.lzhをダウンロード。解凍。TAR.EXEがあるフォルダtar11にパスを通す。
再度、rake。今度は成功したよう。libxml-ruby-0.9.7-x86-mswin32-60の下に、adminフォルダができる。admin\pkg\libxml-ruby-0.9.7フォルダ内の構成は、rake前のlibxml-ruby-0.9.7-x86-mswin32-60内の構成と全く同一。
libxml_ruby.rbができないのはrakeが失敗していたせいではないのか?結局、以前と状況変わらず(つД;)
libxml-ruby-0.9.7-x86-mswin32-60\ext\mingw でも rake
libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwにもRakefileがある。そこでもrakeしてみる。エラーとなる。
(in C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw) cp libxml_ruby.so rake aborted! can't convert nil into String C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw/rakefi le:23 (See full trace by running task with --trace)
rake --traceしてみる。
(in C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw) ** Invoke default (first_time) ** Invoke install (first_time) ** Execute install cp libxml_ruby.so rake aborted! can't convert nil into String c:/ruby/lib/ruby/1.8/fileutils.rb:1408:in `directory?' c:/ruby/lib/ruby/1.8/fileutils.rb:1408:in `fu_each_src_dest0' c:/ruby/lib/ruby/1.8/fileutils.rb:1393:in `fu_each_src_dest' c:/ruby/lib/ruby/1.8/fileutils.rb:382:in `cp' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1070:in `cp' C:/ruby/lib/ruby/gems/1.8/gems/libxml-ruby-0.9.7-x86-mswin32-60/ext/mingw/rakefi le:23 c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `call' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:617:in `execute' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `each' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:612:in `execute' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:578:in `invoke_with_call_c hain' c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_c hain' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:588:in `invoke_prerequisit es' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `each' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:585:in `invoke_prerequisit es' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:577:in `invoke_with_call_c hain' c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:571:in `invoke_with_call_c hain' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:564:in `invoke' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2027:in `invoke_task' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `each' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2005:in `top_level' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exceptio n_handling' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1999:in `top_level' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1977:in `run' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:2044:in `standard_exceptio n_handling' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/lib/rake.rb:1974:in `run' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.4/bin/rake:31 c:/ruby/bin/rake:19:in `load' c:/ruby/bin/rake:19
Rakefileの23行目のコピーがうまくいっていない。23行目では、dest_pathにEXTENSION_NAMEをコピーしている。
cp(EXTENSION_NAME, dest_path)
dest_pathには、20行目でRUBYLIBDIR環境変数が設定されている。たぶん、ここで、環境変数がなくて、nilが設定されていたんだろう。
dest_path = ENV['RUBYLIBDIR']
libxml-ruby-0.9.7-x86-mswin32-60\ext\mingw の Rakefile
でも、ヒントを得た。dest_pathは"libxml-ruby-0.9.7-x86-mswin32-60\lib"となるはずであり、15行目の"task :install do"からはじまるブロックが正しく実行されれば、libxml-ruby-0.9.7-x86-mswin32-60\ext\mingwにある以下の4つのファイルが、libxml-ruby-0.9.7-x86-mswin32-60\libにコピーされるはずである。
でも、libxml-ruby-0.9.7-x86-mswin32-60\lib にそのようなファイルは見当たらない。それで、手動で、上の4つのファイルをコピーしてみたら、XMLパーサが使えるようになりました。
以上が、Windowsで、ActiveSupportのXMLパーサをLibXMLに切り替えるのステップ2に至った経緯です。