从ruby目录中要求所有文件的最佳方法是什么?
从ruby目录中要求所有文件的最佳方法是什么?
Answers:
怎么样:
Dir["/path/to/directory/*.rb"].each {|file| require file }
require
存在与否并不引起混淆.rb
。在MRI 1.8.7-p374、2.1.5和2.2.0上进行了测试。这个城市传说来自Rails,“聪明”的自动加载展示了他在较旧版本中描述的行为(并且可能仍然展示出来)。
如果是相对于需要执行此操作的文件的目录(例如,要加载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:
它可以让您简单地:
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以块作为参数。
method(:require)将返回require方法。
&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
。在这种情况下,请使用负载,因为它可以更好地表达您要完成的任务。例如:
Dir["/path/to/directory/*.rb"].each {|file| load file }
我没有像某些答案那样串联路径,而是使用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
Rails.root.join
如果您遇到困难,也可以使用各种答案。
在Rails中,您可以执行以下操作:
Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
更新:通过@Jiggneshh Gohel的建议进行了更正,以删除斜杠。
Rails.root.join('/lib')
不会生成正确的路径。我发现此工具可以正常工作:Dir[Rails.root.join('lib', 'ext', '*.rb')].each { |file| require file }
那又如何require_relative *Dir['relative path']
呢?
require_relative *Dir['*.rb']
工作,如果只有一个红宝石脚本。但是,如果找到多个红宝石脚本,您会得到require_relative': wrong number of arguments (4 for 1) (ArgumentError)