Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么gem在bundle更新后仍然过时_Ruby_Rubygems_Bundler - Fatal编程技术网

Ruby 为什么gem在bundle更新后仍然过时

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

我正在开发一个gem,它在github上

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

我明白了:

 * 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)