【问题标题】:Two separately namespaced Gemfiles in one Rails app?一个 Rails 应用程序中有两个单独命名空间的 Gemfile?
【发布时间】:2014-10-30 20:11:33
【问题描述】:

我需要在我的 Rails 3.2 应用程序中使用这两个 gem:

gem 'google-adwords-api'
gem 'netsuite'

但是,它们在 savon gem 的版本上存在冲突。 Bundler 吐出这个:

Bundler could not find compatible versions for gem "savon":
    In Gemfile:
        google-adwords-api (>= 0) ruby depends on
            google-ads-common (~> 0.2.0) ruby depends on
                savon (~> 0.9.1) ruby

    netsuite (= 0.2.6) ruby depends on
        savon (2.3.3)

我的项目中绝对需要这两种宝石,所以这是我迄今为止尝试过的。我已将 google-adwords-api gem 移动到我命名为“adx_interface”的自定义 Rails 引擎中,并将其安装在我的 Rails 应用程序中。这个引擎有它自己的 Gemfile。如果我将此行放在我的 Rails 应用程序的 Gemfile 中,那么 Bundler 错误仍然存​​在:

gem "adx_interface", "0.0.1", :path => "#{File.expand_path(__FILE__)}/../vendor/adx_interface"

有没有办法给这个引擎命名,这样它的依赖关系就不会与应用程序依赖关系发生冲突?我尝试从应用程序 Gemfile 中排除 gem "adx_interface" 行,但这意味着我必须开始手动要求 gems 而不是依赖 Bundler。这是一个可行的解决方案吗?如果是这样,我该如何包含 google-adwords-api 以使其命名空间正确且 savon 不会与 netsuite 的 savon 冲突?

对于它的价值,我亲自联系了 google-adwords-api gem 的作者。他说他喜欢 savon 0.9.1 gem 并且没有更新到更新版本的计划。

【问题讨论】:

    标签: ruby-on-rails ruby bundler


    【解决方案1】:

    您正在尝试做的事情与 Bundler 背后的想法完全相反。 Bundler 可以帮助您管理依赖项并发现冲突。

    没有绕过这个限制的干净方法。我能想到的唯一解决方案是 fork google-adwords-api gem,增加依赖项并让您的 Gemfile 指向您的自定义 fork。

    【讨论】:

    • 要详细说明这一点,如果 Bundler确实 允许这样做,您可能会在运行时遇到问题。两个版本的 gems 将以不同的方式定义相同的类和模块,一个会覆盖另一个。
    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2022-11-23
    • 2013-07-14
    • 2019-08-19
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多