我正在将一个大型应用程序拆分为多个较小的应用程序。这样做时,我意识到通过创建 Gemfile.global 并将其包含在我的主应用程序和子应用程序中,我可以清理所有 Gemfile s。例如,我所有的部署 gem 都在主 Gemfile 中,而我的 rails 在 Gemfile.global 中。

它几乎适用于我的所有 gem ,除了一个: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 installrails 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 运行时常量?

最佳答案

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

gemfiles = [ 'Gemfile.global' ]
gemfiles.each do |gemfile|
  instance_eval File.read(gemfile)
end

关于ruby-on-rails - 从多个其他人组合一个 Gemfile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13783801/

10-15 12:11