Sam*_*kes 450
怎么样:
Dir["/path/to/directory/*.rb"].each {|file| require file }
Run Code Online (Sandbox Code Playgroud)
jan*_*dot 337
如果它是相对于执行要求的文件的目录(例如,您要加载lib目录中的所有文件):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
Run Code Online (Sandbox Code Playgroud)
编辑:根据以下评论,更新版本:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
Run Code Online (Sandbox Code Playgroud)
小智 98
尝试require_all gem:
它让你简单地:
require_all 'path/to/directory'
Run Code Online (Sandbox Code Playgroud)
Pet*_*son 52
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
Run Code Online (Sandbox Code Playgroud)
如果你没有剥离扩展,那么你最终可能需要两次相同的文件(ruby不会意识到"foo"和"foo.rb"是同一个文件).两次需要相同的文件会导致虚假警告(例如"警告:已经初始化常量").
met*_*gfu 42
Dir.glob(File.join('path', '**', '*.rb'), &method(:require))
Run Code Online (Sandbox Code Playgroud)
或者,如果要将文件范围加载到特定文件夹:
Dir.glob(File.join('path', '{folder1,folder2}', '**', '*.rb'), &method(:require))
Run Code Online (Sandbox Code Playgroud)
说明:
Dir.glob以块为参数.
method(:require)将返回require方法.
&method(:require)会将方法转换为bloc.
Rya*_*ary 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
Run Code Online (Sandbox Code Playgroud)
请注意,前两行返回true意味着两次都加载了相同的文件.使用路径时,即使路径指向同一位置,require也不知道该文件是否已被要求.
在这里,我们将一个目录添加到加载路径,然后需要每个*.rb文件的基名.
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
Run Code Online (Sandbox Code Playgroud)
如果你不关心文件被多次需要,或者你的意图只是加载文件的内容,也许load应该用来代替require.在这种情况下使用load,因为它更好地表达了您要完成的任务.例如:
Dir["/path/to/directory/*.rb"].each {|file| load file }
Run Code Online (Sandbox Code Playgroud)
Koe*_*en. 14
我没有像在某些答案中那样连接路径,而是使用File.expand_path:
Dir[File.expand_path('importers/*.rb', File.dirname(__FILE__))].each do |file|
require file
end
Run Code Online (Sandbox Code Playgroud)
更新:
而不是使用File.dirname你可以做以下事情:
Dir[File.expand_path('../importers/*.rb', __FILE__)].each do |file|
require file
end
Run Code Online (Sandbox Code Playgroud)
凡..条的文件名__FILE__.
小智 13
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
Run Code Online (Sandbox Code Playgroud)
这将在您的本地计算机和一个不使用相对路径的远程(如Heroku)上递归工作.
在Rails中,您可以:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
Run Code Online (Sandbox Code Playgroud)
更新:修正了@Jiggneshh Gohel删除斜线的建议.