require
d Ruby文件在同一位置的另一个文件中找不到常量,我怀疑是因为Ruby在使用Dir.each
时从文件系统接收文件的顺序。不同的机器/操作系统上会出现不同的行为。是否有一个独立于文件系统的方法来使用require?
在使用rspec的rails应用中,我们有一个spec_helper,需要spec/support
下的所有内容:
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
在该树下的模块中,A类继承自B,但在a.rb
之前需要在一台机器(MacOS)上b.rb
并因为无法找到A而死亡。 Ubuntu)没有问题。事实上,我看不出应该在该机器上工作的充分理由。
#a.rb
puts "required A"
module MyModule
class A < B
end
end
#b.rb
puts "required B"
module MyModule
class B
end
end
当规格在Mac上运行时,Dir.each {require}
会导致以下输出:
required A
/Users/me/myproject/spec/support/mymodule/a.rb:4:in `<module:MyModule>': uninitialized constant MyModule::B (NameError)
在Ubuntu机器上,我们有
required B
required A
......没有错误。因为它不是字母的,我猜想Ubuntu上的Ruby是将文件放在文件名以外的文件上,也许是在磁盘上的时间戳或物理位置上。这两个看起来都很脆弱。
答案 0 :(得分:1)
在a:
中明确要求b#a.rb
require 'b'
puts "required A"
module MyModule
class A < B
end
end
这将保证在a之前始终需要b,而不管操作系统的负载顺序如何。
答案 1 :(得分:0)
它只是一个数组,所以你可以这样做:
Dir[Rails.root.join("spec/support/**/*.rb")].sort.reverse.each { |f| require f }
然后确保以正确的顺序满足依赖关系。
答案 2 :(得分:0)
宝石require_all似乎做了我想做的事。