msfukuiの日記

おおまさのみみはそらのみみ。

cygwin 上で gem 2.4.1 が正常に動作しない件への対処

またもやはまってしまったので..。自分用のメモです。

Windows7(32bit) + Cygwin(32bit) + ruby 1.9.3p545 + gem 2.4.1 です。


$ gem i bundler selenium-webdriver test-unit --no-ri --no-rdoc -p [プロキシ設定] --backtrace
ERROR: While executing gem ... (TypeError)
can't convert nil into String
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:679:in `tr'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:679:in `windows_stub_script'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:392:in `block in generate_windows_script'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:391:in `open'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:391:in `generate_windows_script'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:447:in `generate_bin_script'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:421:in `block in generate_bin'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:405:in `each'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:405:in `generate_bin'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:246:in `install'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/request_set.rb:157:in `block in install'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/request_set.rb:141:in `each'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/request_set.rb:141:in `install'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/commands/install_command.rb:249:in `install_gem'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/commands/install_command.rb:299:in `block in install_gems'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/commands/install_command.rb:295:in `each'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/commands/install_command.rb:295:in `install_gems'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/commands/install_command.rb:202:in `execute'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/command.rb:307:in `invoke_with_build_args'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/command_manager.rb:168:in `process_args'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/command_manager.rb:138:in `run'
/usr/lib/ruby/site_ruby/1.9.1/rubygems/gem_runner.rb:54:in `run'
/usr/bin/gem:21:in `
'

installer.rb を見ると、674行目から684行目が以下の様なコードになっていまして、


..
def windows_stub_script(bindir, bin_file_name)
ruby = File.basename(Gem.ruby).chomp('"')
return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{bindir.tr(File::SEPARATOR, File::ALT_SEPARATOR)}\\#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"%~dp0#{ruby}" "%~dpn0" %*
TEXT
end
..

このままだと cygwin で File::ALT_SEPARATOR が nil の時に TypeError になってしまいます。

c.f. constant File::ALT_SEPARATOR (Ruby 2.1.0)

なので、File::ALT_SEPARATOR が nil の時には、""(空文字)を渡してあげる様に修正してあげるとよい感じです。以下、まんま適当なパッチです。


..
def windows_stub_script(bindir, bin_file_name)
ruby = File.basename(Gem.ruby).chomp('"')
file_alt_separator = File::ALT_SEPARATOR || ""
return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{bindir.tr(File::SEPARATOR, file_alt_separator)}\\#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"%~dp0#{ruby}" "%~dpn0" %*
TEXT
end
..

見たところ他にも同じような個所がありそう。とりあえず都度直そうかなって思います。
以下の様な情報も見たので、もうそろそろ Windows+Cygwin で開発するの諦めようかな..。

http://stackoverflow.com/questions/24244371/ruby-on-rails-installation-error-on-cygwin