3

我正在将一个大型应用程序拆分为多个较小的应用程序。这样做时,我意识到通过创建一个Gemfile.global并将其包含在我的主应用程序和子应用程序中,我可以清理我所有的Gemfiles. 例如,我所有的部署 gem 都放在 mainGemfile中,而我的 rails 放在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几乎所有东西都像您期望的那样,以 Squeel 为主GemfileGemfile.global但是,在使用默认的 Squeel 初始化程序时,将其放入 中会破坏初始化过程:

Squeel.configure do |config|
end

rails s抛出一个uninitialized constant Squeel (NameError)即使bundle install报告Using squeel (1.0.13)。为什么这种组合我Gemfile的方法会弄乱 Rails 运行时常量?

4

2 回答 2

7

在将 Gemfile.global 加载到您的 Gemfile 时使用instance_eval而不是。eval即您的项目 Gemfile 应如下所示(删除 File.joins 以避免混淆):

gemfiles = [ 'Gemfile.global' ]
gemfiles.each do |gemfile|
  instance_eval File.read(gemfile)
end
于 2013-05-19T20:33:50.293 回答
5

您还可以使用eval_gemfile

gemfiles = [ 'Gemfile.global' ]
gemfiles.each do |gemfile|
  eval_gemfile gemfile
end
于 2015-08-28T19:18:23.837 回答