Ruby 为什么gem在bundle更新后仍然过时
我正在开发一个gem,它在github上 当我在应用程序中包括gem时,执行capistrano部署,并(在服务器上)运行: 我明白了:Ruby 为什么gem在bundle更新后仍然过时,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,我正在开发一个gem,它在github上 当我在应用程序中包括gem时,执行capistrano部署,并(在服务器上)运行: 我明白了: * authengine (0.0.1 d8baa49 > 0.0.1 de43dfa) 这告诉我最近的提交是可用的。为什么bundle更新(capistrano部署的一部分)不使用最新版本?宿主应用程序的Gemfile中没有版本约束,而且它们具有相同的版本号,只是不同的提交 即使我登录到服务器并运行 bundle update authengine
* authengine (0.0.1 d8baa49 > 0.0.1 de43dfa)
这告诉我最近的提交是可用的。为什么bundle更新(capistrano部署的一部分)不使用最新版本?宿主应用程序的Gemfile中没有版本约束,而且它们具有相同的版本号,只是不同的提交
即使我登录到服务器并运行
bundle update authengine
之后我会得到同样的“过时”结果。我在这里遗漏了什么?运行
bundle update authengine
时返回的输出是什么?它真的说它更新了gem吗?还是忽略了宝石
您可以尝试使用--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
我发现可能导致这种情况的一个原因是捆绑包中的其他gem对gems的版本要求不兼容。Bundler试图通过选择gems的版本来协调这些问题,以便满足所有需求。结果是它悄悄地拒绝更新gems 检查这一点的方法是在文件中设置明确的版本要求。差不多
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”的兼容版本
档案:
厨师长(>10.8)ruby取决于
json(=1.4.4)ruby
因此,在我的例子中,明确要求更新版本的json是一个问题。作者安德烈·阿尔科在2014年指出:
Bundler分解器绝对是一个正在进行的工作,我们会进行调整
特定版本之间的权衡和基于
用户反馈
Bundler始终没有提供最新版本的
每一块宝石都代表着它存在的全部,它确实会产生
很多票都被打开了。在大多数情况下,结果是
Bundler必须在一个gem的最新版本之间进行选择的结果
或者一个不同的宝石,Bundler选择用户不关心的宝石
关于拥有最新版本的。这就是为什么
使您的Gemfile版本要求准确反映您的实际需求
要求
我知道你认为Bundler会给你
最新的可能版本在当时似乎是有效的,但文档仅限于
说你会得到一个满足你需求的版本,而不是
最新的。有没有什么地方可以扩展文档以使其更清晰
所有东西的最新版本根本不可行
您是否有机会提交您的
Gemfile.lock
?谢谢您的建议,Matenia。我正在提交Gemfile.lock,但我现在没有,这也没什么区别。不。。您应该尽可能提交Gemfile.lock。。它确保您的gem版本在dev和prod之间保持同步(前提是不需要系统特定的gem),您在运行bundle update之前是否尝试过指定:ref=>'de43dfa'
参数(只是建议强制它使用正确的ref),再次感谢Matenia。Yehuda Katz在他的博客中坚持Gemfile.lock不应受版本控制。这也是bundler文档中的建议(可能由Yehuda编写)。我还没有尝试指定ref,这可能会起作用,但只有这一次。。。gem更新的那一刻,我就被之前的提交卡住了。我最初被上面的评论弄糊涂了,是保留还是不保留Gemfile.lock。如果您正在编写gem,请不要将Gemfile.lock保留在版本控制中。如果您正在编写应用程序,请始终将Gemfile.lock保留在版本控制中。因为问题是关于宝石的…谢谢你的建议,JeanMertz。当我进行捆绑更新时。它说“使用authengine(0.0.1)从git://...etc. 因此,它使用的是已安装的内容,而不是获取新的副本。我也尝试了您的其他建议,但没有成功。不过,谢谢。谢谢您--非常好的信息。我真的被这种行为弄糊涂了,所以我尝试了您的建议,并看到相同类型的无声失败。我希望“捆绑更新”“提供了关于这些故障的更多反馈。感谢您提供了有关手动设置预期版本以找出导致冲突的原因的提示。所有内容的最新版本根本不可行
您的意思是算法上的吗?从Judson的回答中,我理解这意味着gem之间的依赖性意味着它们中的一些阻碍了另一些。
bundle update authengine
logical-construct (>= 0) ruby depends on
json (1.7.5)