【问题标题】:Bundler, when attempting to update or install, will hang foreverBundler 在尝试更新或安装时将永远挂起
【发布时间】:2012-02-27 15:39:40
【问题描述】:

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

例如:

bundle update

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

bundle update activerecord

然后它会正常完成。

我们将不胜感激。

【问题讨论】:

  • 您在什么环境(操作系统和 Ruby 版本)上运行?你能得到捆绑包“bundle -v”的版本吗?您是否尝试过卸载并重新安装捆绑软件?还有你的 Gemfile 是什么样的?您可能还想尝试使用 --verbose 选项运行

标签: ruby rubygems bundler


【解决方案1】:

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

常见模式:

  • 你没有安装那个 gem
  • 您没有安装该 gem 的依赖项
  • 如果没有依赖项,您就没有安装该 gem

最简单的技巧

创建一个新的 gemset,然后重新捆绑。这样可以多次解决问题。

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


更简单的技术

在写完这个答案后学到了一些东西,我想我会通过 this excellent article 了解如何运行带有详细调试输出的捆绑程序

export DEBUG_RESOLVER=1
bundle  2> debug_output.txt 1> stdio.txt &

这会将所有调试(错误)输出转储到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 installbundle update


调试您的私有 Gemserver 技术

我需要使用这种消除过程方法来确定我的(企业)gemserver 索引已损坏

  1. 注释掉所有宝石
  2. 运行bundle update确认空集工作
  3. 取消评论一颗宝石和bundle update
  4. 转到 3 直到遇到问题
  5. 研究其依赖关系

完成后

取消设置ENV var

取消设置 DEBUG_RESOLVER

【讨论】:

    【解决方案2】:

    您也可以尝试使用--verbose 标志来获得更多输出,但它确实过时并且不是很有帮助。从我所见,真正做到这一点的唯一方法是:

    1. 一次取消注释一个 gem,直到它停止工作,然后尝试弄清楚到底发生了什么。
    2. 一次移除一个 gem 的版本强制(如果有的话),看看是否可以修复它。
    3. 如果可以的话,删除有问题的 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 有问题,但不确定。

    【讨论】:

    • 听起来很熟悉。我同意有一个场景可以(可能)重复发生并重新创建。无论是错误还是消息传递不佳,我认为都需要进行修复。
    【解决方案3】:

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

    【讨论】:

    • 谢谢你这么说。这里也发生了同样的事情。 :D
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2013-11-11
      • 2017-10-03
      • 1970-01-01
      • 2015-02-06
      • 2016-08-21
      • 2019-04-20
      相关资源
      最近更新 更多