`Gem.find_files`与自己交互

时间:2014-12-26 20:47:43

标签: ruby gem

假设我没有安装某个宝石,请说"oj"。如果我执行以下操作,则将安装gem,最后Gem.find_files将返回安装它的路径。

require "open3"
name = "oj"
_, out, err, thread = Open3.popen3("sudo gem install #{name}")
thread.join
puts out.read, err.read
p Gem.find_files(name)

但是,如果我(卸载gem并且)运行以下内容,那么在结束时发生相同的调用之前会有额外的Gem.find_files(name)行,

require "open3"
name = "oj"
if Gem.find_files(name).empty?
  _, out, err, thread = Open3.popen3("sudo gem install #{name}")
  thread.join
  puts out.read, err.read
  p Gem.find_files(name)
end

然后Gem.find_files返回一个空数组。似乎Gem.find_files的第一次调用(安装前)使Gem.find_files的第二次调用(安装后)返回一个空数组。

  • 为什么它会返回一个空数组?
  • 如何修复Gem.find_files的两次或两次出现,以便第一次(安装前)返回一个空数组,后一个(安装后)返回包含的路径?

1 个答案:

答案 0 :(得分:1)

第一次调用find_files时,Gem代码会缓存一堆信息,包括当前的gem规范及其目录。

第二次拨打find_files时,Gem代码会使用相同的缓存信息,因此不知道您的新gem已被添加。

解决方案是安装新的gem,然后像这样重置缓存:

Gem::Specification.reset