从多个其他人组成一个Gemfile

时间:2012-12-09 01:30:04

标签: ruby-on-rails rubygems gem gemfile squeel

我正在将一个大型应用程序分成多个较小的应用程序。在这样做时,我意识到通过创建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运行时常量?

2 个答案:

答案 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