如何覆盖gem依赖?

我有2个gem依赖于相互冲突的hashie版本(一个需要〜> 1.2.0而另一个需要3.3.1):

Bundler could not find compatible versions for gem "hashie": In Gemfile: restforce (>= 0) ruby depends on hashie (~> 1.2.0) ruby omniauth (>= 0) ruby depends on hashie (3.3.1) 

我想保留两个gem并使用更高版本的hashie。 有没有办法覆盖其中一个gem依赖项?

标准建议是使用更高版本兼容

我这样做,但我认为bundler有一个已定义的命令。

首先在gem 'omniauth'删除gem 'omniauth'行。 运行bundle install ,然后你必须再次将gem 'omniauth'的行添加到你的Gemfile中,再次运行bundle install。

如果你看一下Gemfile.lock,这个安装hashie 2.0.5 ,兼容性更高。

编辑:为什么它有效?

首先,我用hashie检查omn​​iauth依赖关系: hashie < 4, >= 1.2 ,然后与restforce相同: hashie < 2.1, >= 1.2.0 。 在这一点上,我知道1.2和2.0.x之间的任何版本的hashie都必须工作。 然后我们必须删除使用hassie 3.3.1的Gemfile.lock中的约束,从Gemfile中删除’omniauth’它已完成。 之后,当安装restforce时,bundler会发现新版本与restforce’2.0.5’兼容。 当你再次添加omniauth时,不要更新已完成的依赖项。

我认为bundle update实际上就是你所追求的。 如果需要,可以排除依赖关系并安装不同版本的gem,为您提供最新的gem。

但要小心,因为更新gem会引入兼容性问题。