同时使用2个版本的gem

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

  1. Pengwynn的LinkedIn https://github.com/pengwynn/linkedin对于LinkedIn API调用,依赖于oauth(〜> 0.3.5)
  2. 用户通过多个知名网站登录的OmniAuth依赖于oauth 0.4.0

当我尝试在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. 

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

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

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

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

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

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

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

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

不必为客户提供新function或更改请求,而是必须使用Ruby,即所谓的“gem地狱”。

“gem地狱”的另一个主要特点是并不总是最新的gem发布是好的。

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

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

对于较小的应用程序我可以建议的是:

  • 了解所有最新gem版本的最新信息

对于更大类型的应用程序我可以建议什么,当上面不是一个选项时:

  • 将您的应用程序拆分为几个较小的应用程序服 这将使他们分开,冒着让“gem地狱”变小的风险。 如果它发生,很可能不会发生所有这些。 此外,不同的应用程序可以使用不同的gem版本

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