同时使用2个版本的gem
我可以在一个应用程序中使用两个版本的gem吗? 我正在尝试使用两个rails插件一起工作:
- Pengwynn的LinkedIn https://github.com/pengwynn/linkedin对于LinkedIn API调用,依赖于oauth(〜> 0.3.5)
- 用户通过多个知名网站登录的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解决这些问题