0

在我的 Gemfile

source 'https://rubygems.org'
ruby '2.1.0'
gem 'rails', '4.0.1'
gem "faraday"
gem "faraday_middleware"
gem "twitter", github: 'sferik/twitter'

如果我跑

$ bundle install

我明白了

Bundler 找不到 gem "faraday" 的兼容版本:在 Gemfile 中:

twitter (>= 0) ruby depends on
  faraday (~> 0.9.0) ruby

  faraday (0.8.9)
4

1 回答 1

1

TL;DR:尝试运行bundle update.

Bundler 尝试以所有依赖项也匹配的方式查找匹配的 gem。所以考虑一下:

  • gem A v1 依赖于 B v1
  • gem A v2 依赖于 B v2
  • gem C v1 依赖于 B v1
  • 没有知道如何处理 B v2 的 C 版本。

在这种情况下,Bundler 会选择(甚至降级)A 到 v1,这样就可以让 A 和 C 并排运行。

但是,有几件事可能会阻止这种情况发生,这将导致您看到的错误:

  1. 没有 A v1,所以根本无法匹配。你被困在这种情况下,这些宝石根本不会一起工作。
  2. 您已经安装了 A v2,稍后您将添加 C。这意味着 Bundler 需要降级 A,但仅在运行bundle install. 您必须特别说明它需要通过运行bundle update A或为您的 gemfile 中的所有 gem 重新计算依赖项:bundle update.
  3. 其中一个宝石来自 git 存储库。Git 存储库并没有像 ruby​​gems.org 上托管的 gem 这样的版本。这意味着 Bundler 只会获取最新版本,而不能降级该 gem。在这种情况下,您需要手动指定分支或修订。

我的猜测是您正在查看方案 2。您已经安装(并锁定)了法拉第 0.8.9 版。通过添加 twitter,您之前的锁需要更新。

但是,请注意不要在bundle update没有参数的情况下运行。它将尝试获取 gemfile 中每个 gem 的最新版本,这可能不是您想要的。

于 2014-02-15T11:24:09.340 回答