捆绑更新后为什么宝石仍然过时

时间:2012-06-22 15:26:36

标签: ruby rubygems bundler

我正在研究一个宝石,它在github上。

当我在应用程序中包含gem时,执行capistrano部署,并(在服务器上)运行:

bundle outdated

我明白了:

 * authengine (0.0.1 d8baa49 > 0.0.1 de43dfa)

告诉我可以使用更新的提交。为什么捆绑更新(capistrano部署的一部分)没有拉出更新的版本?主机应用程序的Gemfile中没有版本约束,无论如何它们具有相同的版本号,只是不同的提交。

即使我登录服务器并运行

bundle update authengine

之后我得到了相同的“过时”结果 我在这里缺少什么?

3 个答案:

答案 0 :(得分:15)

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

检查的方法是在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”的兼容版本:In   的Gemfile:       厨师(> 10.8)红宝石依赖         json(< = 1.6.1,> = 1.4.4)ruby

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

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

答案 1 :(得分:2)

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

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

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

此外,当出现意想不到的事情时,我总喜欢清理我的gemlist。可能是你仍然有旧版本的宝石,而不是在捆绑器中使用。

所以你可以这样做:

gem list
gem check
gem cleanup

或者完全重新安装

gem uninstall authengine
bundle install

答案 2 :(得分:2)

作者AndréArko,stated在2014年:

  

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

     

Bundler一直没有提供最新版本的   每个宝石都存在于它的整个存在,它确实导致了它   很多门票正在打开。在大多数情况下,事实证明是   Bundler必须在一个宝石的最新版本之间进行选择   或者不同的宝石,Bundler选择用户不关心的宝石   关于拥有最新版本的。这就是为什么它如此重要   使您的Gemfile版本要求准确反映您的实际情况   要求。

     

我认识到你的假设是Bundler会给你的   最新版本似乎在当时有效,但仅限于文档   说你会得到一个符合你要求的版本,而不是   最新。我们可以在任何地方扩展文档以使其更清晰   一切的最新版本根本不可行?