假设我没有安装某个宝石,请说"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
的两次或两次出现,以便第一次(安装前)返回一个空数组,后一个(安装后)返回包含的路径?答案 0 :(得分:1)
第一次调用find_files
时,Gem代码会缓存一堆信息,包括当前的gem规范及其目录。
第二次拨打find_files
时,Gem代码会使用相同的缓存信息,因此不知道您的新gem已被添加。
解决方案是安装新的gem,然后像这样重置缓存:
Gem::Specification.reset