同时使用2个版本的gem

时间:2010-12-02 09:57:29

标签: ruby-on-rails rubygems

我可以在一个应用程序中使用两个版本的gem吗?我正在尝试使用两个rails插件一起工作:

  1. Pengwynn的LinkedIn https://github.com/pengwynn/linkedin用于LinkedIn API调用,依赖于oauth(〜> 0.3.5)
  2. OmniAuth用户通过多个知名网站登录,依赖于oauth 0.4.0
  3. 当我在rails中尝试某些内容时,我收到此错误消息:

    $ rails server
    c:/Ruby187/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/resolver.rb:129:in `resolve': Bundler could not find compatible versions for gem "oauth": (Bundler::VersionConflict)
      In snapshot (Gemfile.lock):
        oauth (0.4.4)
    
      In Gemfile:
        linkedin depends on
          oauth (~> 0.3.5)
    
    Running `bundle update` will rebuild your snapshot from scratch, using only
    the gems in your Gemfile, which may resolve the conflict.
    

    尝试捆绑更新只会冻结我的终端

    是否可以同时使用这两个插件?

2 个答案:

答案 0 :(得分:12)

使用单个gem的两个版本通常意味着:使用同一类的两个版本。

如果不对这些宝石进行修改,这是不可能的。您可以尝试将创建的类放在某个模块中,解决导入到其他类中的方法中的冲突,等等。一般来说,这不是一件容易的事,通常效果不值得。

在这种情况下你应该做的是要求gem维护者更新依赖关系,或者尝试自己做。

也许您可以将这些宝石中的一个降级(使用旧版本)到依赖关系相同的版本。

答案 1 :(得分:3)

不幸的是,在Ruby中,唯一的方法是修复(原文如此!)那些宝石,因此它们使用兼容的依赖项

一般来说,在Ruby中构建复杂的软件并且遇到这种情况时,我们 - Ruby开发人员 - 做不了多少。这非常糟糕,因为Ruby的开发也必须关注这个问题。

不必为客户提供新功能或更改请求,而是必须使用Ruby,即:#34; gem hell"。

宝石地狱的另一个主要特征"并不总是最新的宝石发布是好的。

  • 通常,gem不遵循语义版本控制策略,并且可以引入主要的API修改。
  • 通常情况下,新的gem发布可能会为以前工作的功能带来新的错误。

其他编程语言可以选择处理这些类型的问题。只需搜索" java同一类的多个版本"而且你会发现很多资源。

我对小型应用程序的建议是:

  • 了解所有最新宝石的最新信息。版本

对于更大类型的应用程序我可以建议什么,当上述情况不适用时:

  • 将您的应用程序拆分为几个较小的应用程序服务。 这将使他们分开冒险拥有"宝石地狱"小。如果它发生,很可能不会发生所有这些。 此外,不同的应用程序可以使用不同的宝石版本。

  • 切换到JRuby,理论上可以通过Java功能解决这些问题