Gem Gem 版本依赖冲突怎么办

suupic · 2012年05月08日 · 最后由 huacnlee 回复于 2012年05月08日 · 8114 次阅读
$bundle install
Fetching source index for http://rubygems.org/
You have requested:
  redis-namespace ~> 1.1.0
The bundle currently has redis-namespace locked at 1.0.3.
Try running `bundle update redis-namespace`

$ bundle update redis-namespace
Fetching source index for http://rubygems.org/
Bundler could not find compatible versions for gem "redis-namespace":
  In Gemfile:
    resque (~> 1.20.0) ruby depends on
      redis-namespace (~> 1.0.2) ruby
    redis-namespace (1.1.0)


redis-search 要求 redis-namespace 1.1 resque 要求 redis-namespace 1.0

这种情况怎么解决?

最简单的办法是看下 redis-search 有没有依赖 redis-namespace 1.0 的版本吧?

#1 楼 @loddit 我先改成 redis-namespace 1.0.3 了,初步用了一下还没发现异常。

但我还是想知道,如果存在这样一个依赖不同版本 gem 的情况,而且不允许调换版本,是不是就无解了

把 gemfile.lock 删掉,重新 bundle install。或者单独 bundle update 某个 gem。

但是你这种情况没办法,因为 resque 的版本依赖写死了。版本差一点不要紧的。

如果两边都锁定了 gem 的某个版本那就误解,你要看那个 gem 的 gemspec 里面是如何描述的。 比如 redis-search 的是这样:

s.add_dependency("chinese_pinyin", [">= 0.3.0"])
s.add_dependency("redis-namespace", ">= 1.0.2")
s.add_dependency("redis", [">= 2.1.1"])

对于这些 Gem 是要求大于等于后面的版本,所以任意在对应版本之上都是可以的。


而有些 Gem 可能有特定的要求,将 Gem 锁定了小版本比如这样,用 ~> 符号:

s.add_dependency("redis-namespace", "~> 1.0.2")

这个表示需要 redis-namespace 1.0.x 的,第三位的版本号可以在 2 之上,但是前面必须是 1.0


只有那种没有写符号的才会强制要求指定的版本,比如下面这个就要求必须是 1.0.2,不过这种情况很少:

s.add_dependency("redis-namespace", "1.0.2")

需要 登录 后方可回复, 如果你还没有账号请 注册新账号