透明思考


Transparent Thoughts


编程选择GEM安装版本

rayzer留言说:

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

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

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

echo “1” | gem install fastthread -y

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

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

def install_gem(name)cmd = “gem install #{name} -y –no-rdoc –no-ri”puts cmdIO.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 $1endendbr / endendinstall_gem “fastthread”

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