4

我一直在与轨道3和打包机左右作战。如果rails应用程序尚未加载,那么有几个gem不能正常工作。 factory_girl和shoulda都是例子,即使在rails3分支上也是如此。 以早该为例,试图运行rake test:units我收到以下错误时:
DEPRECATION WARNING: RAILS_ROOT is deprecated! Use Rails.root instead. (called from autoload_macros at c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:40) c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'join': can't convert #<Class:0x232b7c0> into String (TypeError) from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'block in autoload_macros' from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'map' from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/autoload_macros.rb:44:in 'autoload_macros' from c:/code/test_harness/vendor/windows_gems/gems/shoulda-2.10.3/lib/shoulda/rails.rb:17:in '<top (required)>' 当 - 完全 - Rails3应用程序是否被初始化?

挖成深一点的lib /早该/护栏,我看到:
root = if defined?(Rails.root) && Rails.root
Rails.root
else
RAILS_ROOT
end
# load in the 3rd party macros from vendorized plugins and gems
Shoulda.autoload_macros root, File.join("vendor", "{plugins,gems}", "*")

所以.. 。这里发生了什么是Rails.root被定义,Rails.root == nil,所以使用RAILS_ROOT,RAILS_ROOT == nil,然后传递给Shoulda.autoload_macros。很明显,Rails应用尚未初始化。现在Rails3使用Bundler,在Bundler方面有一些关于能够指定需要的宝石的命令,但我不确定这是否能解决手头的问题。
最终我的问题是这样的:什么时候environment.rb文件(实际上初始化应用程序)被拉入?在应用程序初始化时遇到碰撞并在config/application.rb中的Bundler.require行之前发生?我试图破解bundler来自己指定顺序,并首先将rails gem拉进来,但在我看来并不需要使用rails gem来初始化应用程序。
由于该行(在config/application.rb中)在应用程序初始化之前被调用,所以需要导轨初始化的打包器Gemfile中的任何gem都将被打开。

# Auto-require default libraries and those for the current Rails environment. Bundler.require :default, Rails.env

回答

1

那么,它实际上是很容易追查下来。所有的rails库都被拉入application.rb。该应用程序本身正在初始化在environment.rb