【问题标题】:Require all files in sub-directory需要子目录中的所有文件
【发布时间】:2011-05-30 12:06:07
【问题描述】:

我有以下目录树。

- app.rb
- folder/
  - one/
    - one.rb
  - two/
    - two.rb

我希望能够加载文件夹/目录中的 Ruby 文件,甚至是子目录中的文件。我该怎么做?

【问题讨论】:

标签: ruby filesystems require


【解决方案1】:

在我的项目中,这会评估为["./fixset.rb", "./spec/fixset_spec.rb", "./spec/spec_helper.rb"],这会导致我的规范运行两次。因此,这是一个经过调整的版本:

Dir[File.join(".", "**/*.rb")].each { |f| require f unless f[/^\.\/spec\//]}

这将安全地忽略 ./spec/ 中的所有 *.rb 文件

【讨论】:

    【解决方案2】:

    试试这个:

    Dir.glob(File.join(".", "**", "*.rb")).each do |file|
       require file
    end
    

    【讨论】:

    • 这将在 Ruby 1.9.2+ 上中断,因为 '.'不再是 requires 搜索路径的一部分。显式前导 '.'或require_relative 是必需的。
    • @Phrogz 感谢您的提醒。 :)
    【解决方案3】:

    代码更少,但仍可在 Linux、OS X 和 Windows 上运行:

    Dir['./**/*.rb'].each{ |f| require f }
    

    在当前目录不再是路径的一部分的 Ruby 1.9.2 中需要'.'

    【讨论】:

      【解决方案4】:

      Jekyll 对其插件做了类似的事情。像这样的东西应该可以解决问题:

          Dir[File.join(".", "**/*.rb")].each do |f|
            require f
          end
      

      【讨论】:

      • 如果您有继承,您需要对所需的文件进行排序,以便首先需要顶级类。 Dir[File.join("#{Rails.root}/app/classes", "*/.rb")].sort_by {|path| path.split("/").length }.each 做 |f|要求结束
      猜你喜欢
      • 2015-09-17
      • 2014-08-12
      • 2013-09-13
      • 2013-10-30
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2016-11-07
      相关资源
      最近更新 更多