我正在将一个大型应用程序分成多个较小的应用程序。在这样做时,我意识到通过创建Gemfile.global
并将其包含在我的主应用程序和子应用程序中,我可以清理所有Gemfile
。例如,我的所有部署宝石都位于主Gemfile
中,我的导轨位于Gemfile.global
。
它几乎适用于我的所有宝石,除了一个:Squeel。
根应用中的Gemfile
开始于:
gemfiles = [
File.join('Gemfile.global'),
]
Dir.glob(File.join(File.dirname(__FILE__), gemfiles)) do |gemfile|
eval(IO.read(gemfile), binding)
end
# gem 'squeel' # Let's try putting this in Gemfile.global
我的Gemfile.global
看起来像是:
source 'https://rubygems.org'
# rails and dependencies
gem 'squeel'
bundle install
效果很好,以及rails s
和几乎所有事情,就像你期望的那样,主要是Gemfile
中的Squeel。但是,将它放在Gemfile.global
中会在使用默认的Squeel初始化程序时搞砸初始化过程:
Squeel.configure do |config|
end
即使rails s
报告uninitialized constant Squeel (NameError)
, bundle install
也会引发Using squeel (1.0.13)
。为什么这种组合我Gemfile
的方法搞乱了rails运行时常量?
答案 0 :(得分:7)
将Gemfile.global加载到Gemfile中时,请使用instance_eval
代替eval
。即您的项目Gemfile应如下所示(删除File.joins以避免混淆):
gemfiles = [ 'Gemfile.global' ]
gemfiles.each do |gemfile|
instance_eval File.read(gemfile)
end
答案 1 :(得分:5)
您还可以使用eval_gemfile
:
gemfiles = [ 'Gemfile.global' ]
gemfiles.each do |gemfile|
eval_gemfile gemfile
end