要求ruby目录中的所有文件的最佳方法?

时间:2009-04-09 17:00:15

标签: ruby file directory require

要求ruby目录中的所有文件的最佳方法是什么?

11 个答案:

答案 0 :(得分:435)

怎么样:

Dir["/path/to/directory/*.rb"].each {|file| require file }

答案 1 :(得分:333)

如果它是相对于执行要求的文件的目录(例如,您要加载lib目录中的所有文件):

Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }

修改:根据以下评论,更新版本:

Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }

答案 2 :(得分:97)

尝试require_all gem:

  1. http://github.com/jarmo/require_all
  2. https://rubygems.org/gems/require_all
  3. 它让你简单地说:

    require_all 'path/to/directory'
    

答案 3 :(得分:52)

Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file| 
  require File.basename(file, File.extname(file))
end

如果你没有剥离扩展名,那么你最终可能需要两次相同的文件(ruby不会意识到“foo”和“foo.rb”是同一个文件)。要求两次使用同一文件可能会导致虚假警告(例如“警告:已初始化常量”)。

答案 4 :(得分:41)

Dir.glob(File.join('path', '**', '*.rb'), &method(:require))

或者,如果要将文件范围加载到特定文件夹:

Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))

解释:

Dir.glob以块为参数。

方法(:要求)will return the require method.

& method(:require)会将方法转换为bloc。

答案 5 :(得分:30)

最好的方法是将目录添加到加载路径,然后require每个文件的基名。这是因为您希望避免意外地需要两次相同的文件 - 通常不是预期的行为。是否加载文件取决于require之前是否已经看到传递给它的路径。例如,这个简单的irb会话显示您可能错误地要求并加载相同的文件两次。

$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false

请注意,前两行返回true,表示同时加载了同一个文件。使用路径时,即使路径指向同一位置,require也不知道该文件已被要求。

在此,我们将一个目录添加到加载路径,然后需要每个* .rb文件的基本名称。

dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }

如果您不关心多次需要该文件,或者您只想加载该文件的内容,则应使用load代替require。在这种情况下使用load,因为它更好地表达了您要完成的任务。例如:

Dir["/path/to/directory/*.rb"].each {|file| load file }

答案 6 :(得分:14)

不是像某些答案那样连接路径,而是使用File.expand_path

Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
  require file
end

<强>更新

您可以执行以下操作,而不是使用File.dirname

Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
  require file
end

..删除__FILE__的文件名。

答案 7 :(得分:13)

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

这将在您的本地计算机和一个不使用相对路径的远程(如Heroku)上递归工作。

答案 8 :(得分:7)

在Rails中,你可以这样做:

Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }

更新:更正了@Jiggneshh Gohel建议删除斜杠。

答案 9 :(得分:3)

我参加派对已经晚了几年,但我有点喜欢这个单行解决方案,我曾经习惯性地将所有内容都包含在app / workers / Concer中:

Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }

答案 10 :(得分:-2)

那么:\w+