Ruby `Gem.find_文件`与自身交互
假设我没有安装某个gem,比如说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并)运行以下命令,在最后发生相同调用之前
“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