Ruby `Gem.find_文件`与自身交互

Ruby `Gem.find_文件`与自身交互,ruby,gem,Ruby,Gem,假设我没有安装某个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,比如说
“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
    ,以便第一个(安装前)返回空数组,后一个(安装后)返回包含的路径

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

第二次调用
find_files
,Gem代码使用相同的缓存信息,因此不知道添加了新的Gem

解决方案是安装新的gem,然后按如下方式重置缓存:

Gem::Specification.reset