【问题标题】:How to require all files in a directory, in a gem?如何在gem中要求目录中的所有文件?
【发布时间】:2012-07-23 17:44:17
【问题描述】:

我知道我可以使用目录中的所有文件

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 命令似乎不起作用,因为它似乎在运行时在我的项目根目录中查找文件路径(无论我有什么项目需要我的宝石)。

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

【问题讨论】:

    标签: ruby rubygems


    【解决方案1】:

    Rubygems 有一个名为 find_files 的工具,可让您根据加载路径中的任何内容进行搜索:

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

    【讨论】:

    • 这会找到所有 rb 文件,而不仅仅是主文件,就像每个 gem 一样,你必须有一个 require 语句才能在应用程序中包含该 gem,你不需要一个一个地要求所有文件,而是一个单人
    • 这也会在 spec 目录中找到文件。在我的例子中,Gem.find_files('mygem/folder/*.rb') 的结果是 --/mygem/lib/mygem/folder/xxx.rb--/mygem/spec/mygem/folder/xxx_spec.rb。当然我们.reject 规范文件,但有更好的方法吗?
    【解决方案2】:

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

    类似

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

    【讨论】:

    • 这不是跨平台的方法。
    猜你喜欢
    • 2017-06-04
    • 2010-10-18
    • 1970-01-01
    • 2015-09-17
    • 2011-05-30
    • 2014-08-12
    • 2013-09-13
    相关资源
    最近更新 更多