rayzer留言说:

“昨天在feisty上装rubyworks的时候,到了安装fastthread一步,会编译本地gem, 并提示mkmf模块依赖关系无法满足,需要引入ruby1.8-dev来解决。”

出现这个问题的原因是,在选择gem安装版本的时候,选中了一个错误的版本:我们提供了预编译好的二进制版本,安装这个版本是不需要有GCC和头文件的;但如果选中了没有预编译的版本,就会在安装的过程中build native extension。

而选中了错误版本的原因是,RubyGems本身没有提供非交互式的安装命令。一旦需要在多个版本中选择,就必须从命令行输入。我们以前用的简单办法是:

echo "1" | gem install fastthread -y

这样做的问题是,如果已经有gem cache(看看你有没有/usr/lib/ruby/gems/1.8/source_cache这个文件),编号1的版本很可能就不是我们提供的那个,而是RubyForge的gem repository里的某一个。于是就出现了开头提到的问题。昨天看到rayzer的留言以后,我终于下定决心把这个问题解决掉……

其实也不难。用IO.popen来开启进程,一行一行读STDOUT,看到合适的选项就往STDIN输入数字:

def install_gem(name)
  cmd = "gem install #{name} -y --no-rdoc --no-ri" 
  puts cmd
  IO.popen(cmd, "r+") do |io|
    io.each_line do |line|
      puts "[out] #{line}" 
      if(line =~ /\s(\d+).*\(i[3|4]86-linux\)/)
    puts "[selection] #{$1}" 
    io.puts $1
      end
    end<br />  end
end
install_gem "fastthread"

这个修改将在0.0.3版本中发布。