Ruby 如何要求gem中目录中的所有文件?

Ruby 如何要求gem中目录中的所有文件?,ruby,rubygems,Ruby,Rubygems,我知道我可以使用 Dir['path/to/files/**/*.rb'].each { |file| require file } 但是,我尝试对gem安装文件执行此操作,如下所示: class MyGem module NS; end end Dir['lib/my_gem/files/**/*.rb'].each { |file| require file } (其中lib/my_gem/files中的所有文件都在MyGem::NS下命名)。目录结构如下所示: lib

我知道我可以使用

Dir['path/to/files/**/*.rb'].each { |file| require file }
但是,我尝试对gem安装文件执行此操作,如下所示:

class MyGem
  module NS; end
end

Dir['lib/my_gem/files/**/*.rb'].each { |file| require file }
(其中
lib/my_gem/files
中的所有文件都在MyGem::NS下命名)。目录结构如下所示:

lib                              
|-- my_gem                        
|   |-- files              
|   |   |-- file1.rb       
|   |   |-- file2.rb         
|   |   |-- file3.rb         
|   |   `-- ... (many more)      
`-- my_gem.rb                     
my_gem.gemspec
而且,当我在另一个文件中需要gem时,
Dir
命令似乎不起作用,因为它似乎在运行时在我的项目根目录中查找文件路径(无论我从哪个项目需要gem)


如何要求
lib/my_gem/files
lib/my_gem.rb
中的所有文件?

您可以使用find进行递归搜索,然后运行响应列表并逐行包含它们

差不多

`find #{root_path}/lib/my_gem/files/**/*.rb`.split("\n").each { |p| require p }

Rubygems有一个名为的工具,允许您基于加载路径中的任何内容进行搜索:

Gem.find_files("my_gem/files/**/*.rb").each { |path| require path }

这不是一种跨平台的方法。这会查找所有rb文件,而不仅仅是主文件,就像每个gem一样,你必须有一个require语句才能在应用程序中包含该gem,你不需要逐个查找所有文件,而是一个单独的文件。这也会查找spec目录中的文件。在我的例子中,
Gem.find_文件('mygem/folder/*.rb')
产生
-/mygem/lib/mygem/folder/xxx.rb
-/mygem/spec/mygem/folder/xxx_spec.rb
。当然我们会拒绝规范文件,但是有更好的方法吗?