【问题标题】:Composing one Gemfile from multiple others从多个其他 Gemfile 组合一个 Gemfile
【发布时间】:2012-12-09 01:30:03
【问题描述】:

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

Squeel.configure do |config|
end

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

【问题讨论】:

  • 经过进一步检查,这完全搞砸了我所有 gem 对常量的访问。我回到了传统方式,但我很好奇为什么会发生这种情况/可组合 Gemfile 的替代方法。
  • 我强烈怀疑你和我遇到了同一现象的略有不同的表现形式......stackoverflow.com/questions/16554397/…
  • 我想是的。本周我将深入研究 bundler 的一些资源,也许我会有一个顿悟。
  • 马上——祝你好运!

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你也可以使用eval_gemfile:

    gemfiles = [ 'Gemfile.global' ]
    gemfiles.each do |gemfile|
      eval_gemfile gemfile
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多