Ruby Bundler在尝试更新或安装时将永远挂起

Ruby Bundler在尝试更新或安装时将永远挂起,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,当尝试运行bundle安装或bundle更新时,bundler将永久挂起,并且不会完成其功能。它将完成的唯一时间是当我指定要更新的gem时 例如: bundle update 除非我像这样使用它,否则它将永远挂起: bundle update activerecord 然后它会像平常一样完成 任何帮助都将不胜感激。此问题是由于缺少依赖关系,或者更糟糕的是依赖关系。当您不使用rubygems.org作为您的gems服务器(企业环境)时,这是很常见的 常见模式: 你没有安装那颗宝石 您没有安装

当尝试运行bundle安装或bundle更新时,bundler将永久挂起,并且不会完成其功能。它将完成的唯一时间是当我指定要更新的gem时

例如:

bundle update
除非我像这样使用它,否则它将永远挂起:

bundle update activerecord
然后它会像平常一样完成


任何帮助都将不胜感激。

此问题是由于缺少依赖关系,或者更糟糕的是依赖关系。当您不使用rubygems.org作为您的gems服务器(企业环境)时,这是很常见的

常见模式:
  • 你没有安装那颗宝石
  • 您没有安装该gem的依赖项
  • 如果没有依赖项,就无法安装gem

最简单的技巧 创建一个新的gemset,然后重新绑定。这多次解决了这个问题

如果由于生产原因,您不能这样做,并且您没有应用程序历史记录来反映添加问题gem的时间,那么:


简易技术 在写了这个答案之后,我学到了一些东西,我想我应该继续学习如何使用详细的调试输出运行bundler

export DEBUG_RESOLVER=1
bundle  2> debug_output.txt 1> stdio.txt &
这会将所有调试(err)输出转储到
debug_output.txt
,并将正常屏幕内容转储到
stdio.txt

您还需要转储
1>
,因为每次bundler将一行转储到
2
(stderr),它都会将一个crlf放入
1
。因此,要么转储
1
要么对作业进行后台处理。我两者都做,这样我就可以在同一个终端工作

我通常会跟进:

tail stdio.txt 
为了确保事情已经开始,那么:

tail -n 10000 -f debug_output.txt 
使用
/FAIL]
在文件中搜索安装依赖项失败的尝试。找到两个相同的,你通常已经找到了你的罪犯。
stderr
适用于
bundle安装
bundle更新


调试您的私有Gemserver技术 我需要使用此消除过程方法来确定我的(企业)gemserver索引已损坏

  • 注释掉所有的宝石
  • 运行
    bundle update
    以确认空集有效
  • 取消对一个gem的注释并
    捆绑更新
  • 转到3直到你找到问题
  • 研究它的依赖关系

  • 完成后 将
    ENV
    var与

    取消调试解析程序

    您也可以尝试使用
    --verbose
    标志来获得更多的输出,但它实际上是过时的,没有多大帮助。从我所看到的情况来看,真正做到这一点的唯一方法是:

  • 每次取消一个gem的注释,直到它停止工作,然后试着弄清楚到底发生了什么
  • 每次删除一个gem(如果有的话),看看是否可以修复它
  • 如果可以(使用不同的gem)或锁定可用的版本,请删除有问题的gem
  • 对我来说,跑步后:

    sudo bundle update --verbose
    
    它一直挂在这里:

    Query Gemcutter Dependency Endpoint API: tenderlove-frex
    Fetching from: http://rubygems.org/api/v1/dependencies?gems=tenderlove-frex
    HTTP Success
    Query List: []
    
    一点帮助都没有。我最终发现这是两个宝石之间的冲突。以下内容将永远挂起:

    source 'http://rubygems.org'
    gem 'rails', '~> 3'
    gem 'airbrake'
    
    我删除了rails版本:

    source 'http://rubygems.org'
    gem 'rails'
    gem 'airbrake'
    
    然后它工作了,但我在Gemfile.lock中注意到它使用的是Rails 2.3.X。所以airbrake似乎依赖于Rails 2,但我想要3。我找不到airbrake具有Rails 2.x依赖性的任何地方,所以不确定为什么会这样结束。为什么bundler不能输出更有意义的东西,这是我无法理解的

    尽管如此,这还是奏效了:

    source 'http://rubygems.org'
    gem 'rails', '~> 3'
    gem 'airbrake', '~> 3'
    

    我真的认为Bundler有问题,但不确定

    捆扎机可能未挂起。我刚刚经历了一个7分钟的时间来捆绑一个相对较小的Gemfile,这是在最快的SSD Macbook Pro上,具有50 Gb的下载连接。

    当部署到AWS实例上时,确保您的安全组允许出站HTTP和/或HTTPS连接-我遇到这个问题是因为我对安全组的限制太多。

    您运行的是什么环境(操作系统和Ruby版本)?你能得到bundle“bundle-v”的版本吗。您是否尝试过卸载和重新安装捆绑包?另外,您的文件看起来像什么?您可能还想尝试使用--verbose选项运行熟悉的声音。我同意有一个场景可以(可能)重复发生并重新创建。无论是bug还是糟糕的消息传递,我认为需要进行修复。谢谢你这么说。这里也发生了同样的事情D