怎么样:
Dir["/path/to/directory/*.rb"].each {|file| require file }
如果它是相对于执行要求的文件的目录(例如,您想加载 lib 目录中的所有文件):
Dir[File.dirname(__FILE__) + '/lib/*.rb'].each {|file| require file }
编辑:根据以下评论,更新版本:
Dir[File.join(__dir__, 'lib', '*.rb')].each { |file| require file }
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each {|file| require file }
Dir[File.join(File.dirname(__FILE__), 'lib', '*.rb')].each {|file| require file }
__dir__
而不是 File.dirname(__FILE__)
。
require_relative
来要求目录中的所有文件?
试试 require_all gem:
http://github.com/jarmo/require_all https://rubygems.org/gems/require_all
它让您简单地:
require_all 'path/to/directory'
require_all
的循环依赖解析解决了您源代码中的一个问题:您拥有不需要依赖关系的 Ruby 源文件。这关闭了手术刀装载的大门,让您进行全有或全无装载。这在小型图书馆中不是问题,但这是您应该有意识地做出的决定。
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
如果您不剥离扩展名,那么您最终可能需要两次相同的文件(ruby 不会意识到“foo”和“foo.rb”是同一个文件)。两次要求同一个文件可能会导致虚假警告(例如“警告:已初始化常量”)。
require "foo.rb"; require "foo";
只会加载 foo.rb
一次。
require
不会因 .rb
扩展的存在或不存在而混淆。在 MRI 1.8.7-p374、2.1.5 和 2.2.0 上测试。这个都市传说来自 Rails,其中“聪明”的自动加载展示了旧版本中描述的行为(并且可能仍然存在)。
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) 会将方法转换为块。
Dir.glob( File.join( File.dirname(__FILE__), '{lib,addons}', 'subfolder', '**', '*.rb' ), &method(:require) )
消除了对平台的依赖(例如“/”或“\”)。效果很好。谢谢。
最好的方法是将目录添加到加载路径,然后 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 }
require
现在需要 ./
并且 require_relative
意识到这些是同一个文件的路径。
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
这将在您的本地机器和不使用相对路径的远程(如 Heroku)上递归工作。
我没有像某些答案那样连接路径,而是使用 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__
的文件名。
File.expand_path
+1
Rails.root.join
答案也适用。
在 Rails 中,您可以:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:更正了@Jiggneshh Gohel 的建议以删除斜线。
Rails.root
是一个 Pathname
实例,您可以在任何 Ruby 环境中执行此操作,而不仅仅是 Rails(注意 Rails.root.join('lib/ext/*.rb')
读起来更好一些)
Rails.root.join('/lib')
不会生成正确的路径。我发现这个可以正常工作:Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
我迟到了几年,但我有点喜欢这种单线解决方案,我曾经让 rails 将所有内容都包含在 app/workers/concerns 中:
Dir[ Rails.root.join *%w(app workers concerns *) ].each{ |f| require f }
那么:require_relative *Dir['relative path']
呢?
require_relative *Dir['*.rb']
工作,如果只有一个 ruby 脚本。但如果找到多个 ruby 脚本,则会得到 require_relative': wrong number of arguments (4 for 1) (ArgumentError)
不定期副业成功案例分享
require
不会因.rb
扩展的存在与否而混淆。在 MRI 1.8.7-p374、2.1.5 和 2.2.0 上测试。这个都市传说来自 Rails,其中“聪明”的自动加载展示了他在旧版本中描述的行为(并且可能仍然存在)。