13

I am working on a gem and it's on github.

When I include the gem in an application, do a capistrano deploy, and (on the server) run:

bundle outdated

I see:

 * authengine (0.0.1 d8baa49 > 0.0.1 de43dfa)

which tells me that a more recent commit is available. Why doesn't the bundle update (part of capistrano deploy) pull the more recent version? There is no version constraint in the Gemfile of the host application, and anyway they have the same version number, just different commits.

Even if I log into the server and run

bundle update authengine

I get the same "outdated" result afterwards.
What am I missing here?

4

3 回答 3

18

我发现可能导致这种情况的一件事是,如果捆绑包中的其他 gem 按不兼容的版本对 gem 提出要求。Bundler 试图通过选择 gem 的版本来协调这些,以便它们的要求都能得到满足。结果是它悄悄地拒绝更新 gems。

检查这一点的方法是在您的 Gemfile 中设置明确的版本要求。就像是

gem "authengine", "> 0.0.2" #(you'll need to bump the version to make this work)
#or
gem "authengine", :ref => "d8baa49"

然后运行

bundle update authengine

你应该看到类似的东西(这取自我的特殊情况):

Bundler 找不到 gem "json" 的兼容版本:在 Gemfile:chef (> 10.8) ruby​​ 依赖于 json (<= 1.6.1, >= 1.4.4) ruby

logical-construct (>= 0) ruby depends on
  json (1.7.5)

因此,在我的情况下,明确要求更新版本的 json 是一个问题。

于 2012-10-25T23:41:17.530 回答
2

运行时返回的输出是什么bundle update authengine?它真的说它更新了宝石吗?还是它忽略了宝石?

您可以尝试使用该--source参数来专门告诉 Bundler 使用 git 存储库。那个,或者你的

bundle update authengine --source https://github.com/mustardseeddatabase/authengine.git

此外,当发生这种意想不到的事情时,我通常喜欢清理我的宝石列表。可能是您仍然有旧版本的 gem,而不是在 bundler 中使用。

所以你可以这样做:

gem list
gem check
gem cleanup

或者完全重新安装

gem uninstall authengine
bundle install
于 2012-06-22T16:03:05.900 回答
2

作者 André Arko在 2014 年表示

Bundler 解析器绝对是一项正在进行的工作,我们会根据用户反馈调整特定版本之间的权衡并快速解析。

Bundler 在其存在的整个过程中始终没有提供每个 gem 的最新版本,它确实导致了很多票被打开。在大多数情况下,结果是 Bundler 不得不在一个 gem 的最新版本或另一个 gem 之间进行选择,而 Bundler 选择了用户不关心的 gem 是否拥有最新版本。这就是为什么让您的 Gemfile 版本要求准确反映您的实际要求如此重要的原因。

我认识到您认为 Bundler 会为您提供最新版本的假设在当时似乎是有效的,但文档只说您将获得满足您要求的版本,而不是最新版本。是否有任何地方可以扩展文档以更清楚地说明所有内容的最新版本根本不可行?

于 2018-03-12T04:10:24.480 回答