更新另一个gem依赖项

时间:2016-05-22 04:53:08

标签: ruby-on-rails ruby rubygems spree gemfile

在我的Gemfile中,我包含一个带有.gemspec的gem,它使用悲观运算符~>来指定gem的版本。但是,我需要使用更新版本的gem。在我的情况下,我使用spree 3-0-stable,其activemerchant设置为'〜> 1.47.0'https://github.com/spree/spree/blob/3-0-stable/core/spree_core.gemspec#L22但我需要使用有效商家'〜> 1.59.0'

我试图在我的Gemfile中指定版本1.59.0,但捆绑抱怨:

  

您已要求:     activemerchant~> 1.59.0

     

该捆绑包目前已将activemerchant锁定在1.47.0。试试跑步   bundle update activemerchant

     

如果您要一次更新Gemfile中的多个宝石,请尝试传递   他们都到bundle update

但命令bundle update activemerchant只会更新到1.47.x.

实现这个目标的轨道是什么?除了自己分享狂欢和更新.gemspec?显然,对activemerchant gem的更新可能会破坏spree gem。但我可以用我的应用程序测试。

2 个答案:

答案 0 :(得分:2)

Bundler 的维护者建议对相关 gem 进行分叉,然后在该 gem 上进行 PR。然后直接链接到您的 Gemfile 中该 PR 中的分支。这鼓励社区围绕解决方案团结起来。

我在此处详细记录了该过程:https://github.com/rubygems/rfcs/pull/13#issuecomment-770416467

答案 1 :(得分:0)

你不能这样做,rubygems系统不允许这样做。您必须为上游gem依赖项提出问题,并要求他们放宽他们的要求。

可能你想要的activemerchant版本实际上不能使用你想要的狂欢版本,它会打破它。如果是这样,则必须修复spree代码以使用新版本的activemerchant。或者,它可以与您想要的版本一起正常工作,狂欢中的限制是偶然不必要的严格,在这种情况下,spree gemspec只需要更改以允许它。

但是如果不改变spree gemspec,你就无法覆盖它。

你可以制作自己的狂欢分支,你可以在其中更改gemspec - 但是如果不知道spree是否真的可以使用你想要的activemerchant版本,那可能会很危险。而且现在你已经自己动手了,所以你无法升级到新版本的狂欢而无需将他们的更改合并到你的分叉等。

另一件事是,运行spree 3-0-stable分支而不是实际发布的gem版本有点奇怪。但我不熟悉狂欢的发布管理实践,也许这是他们鼓励的?无论如何,改变这一点可能无法解决您的问题。

如果您的应用程序相对较新或简单,您可以考虑从狂欢转换为solidus,即狂欢。然而,Solidus在狂欢2.x中分叉,因此从spree 3.x迁移可能并不简单,特别是如果您的应用程序已建立并且有些复杂。虽然solidus_core gem is also locked为activemerchant ~> 1.48.0,但它也不会允许除了activemerchant 1.48.x以外的任何内容。如果你想知道他们是什我发现solidus维护者非常敏感,并且可能有兴趣允许更高版本的activemerchant,如果可行的话。我不熟悉当前的Spree团队以及他们如何与用户沟通(如果他们有松弛或者列表服务器,或者对github问题做出响应,或者是什么),但你当然可以与他们进行相同的对话。