在尊重依赖关系的同时可靠地需要多个文件?

时间:2015-11-02 14:24:49

标签: ruby-on-rails ruby macos ubuntu require

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是将文件放在文件名以外的文件上,也许是在磁盘上的时间戳或物理位置上。这两个看起来都很脆弱。

3 个答案:

答案 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似乎做了我想做的事。