【问题标题】:Can't fix 'bundle install' failing for gems with native extensions无法修复带有本机扩展的 gem 的“捆绑安装”失败
【发布时间】:2011-09-07 08:48:13
【问题描述】:

我正在 Amazon EC2 云服务器上部署 Ruby On Rails 应用程序。该服务器在 Amazon Linux alami-2011.02 上运行。我不能说它所基于的发行版(来自我的搜索,RedHat/CentOS,但我是该领域的新手)。

我已经使用 RVM 安装了我的 Ruby 环境(以 root 身份安装)。我已经设置了两个红宝石:

  • 稀土 1.8.7
  • Ruby 1.9.2-p290

对于我部署的每个 Rails 应用程序,我都会创建一个单独的 RVM gemset。

自从我遇到这个问题以来,我已经通过运行rvm implode 彻底刷新了 Ruby 环境。

这是我的环境版本:

ruby -v      ---> ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
rvm -v       ---> 1.8.1
gem -v       ---> 1.6.2
bundle -v    ---> Bundler version 1.0.18

在此之后rvm implode:

  • 我再次安装了 2 颗红宝石
  • 我为 ree-1.8.7 应用程序创建了一个 gemset 并安装了所需的 gem -> 没问题
  • 我为一个 ruby​​-1.9.2 应用程序创建了一个 gemset,并通过 Bundle 安装了这些 gem -> 没问题,即使对于带有本机扩展的 gems
  • 我为另一个 ruby​​-1.9.2 创建了一个 gemset,尝试通过 Bundle 安装这些 gem...又来了!

这是我在执行bundle install(以root身份登录)时所知道的:

Updating https://github.com/p7r/will_paginate.git
Fetching source index for http://rubygems.org/
Installing rake (0.9.2) 
Installing multi_json (1.0.3) 
Installing activesupport (3.1.0) 
Installing bcrypt-ruby (3.0.0) with native extensions /usr/local/rvm/scripts/rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/installer.rb:552:in `rescue in block in build_extensions': ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)

        /usr/local/rvm/scripts/rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb 

Gem files will remain installed in /usr/local/rvm/scripts/rvm/gems/ruby-1.9.2-p290@app/gems/bcrypt-ruby-3.0.0 for inspection.
Results logged to /usr/local/rvm/scripts/rvm/gems/ruby-1.9.2-p290@app/gems/bcrypt-ruby-3.0.0/ext/mri/gem_make.out

    [ removed the backtrace ]

但是,如果我只使用gem install bcrypt,gem 安装正确,我可以使用bundle install,它将一直运行到下一个带有本机扩展的 gem...

我在安装 ruby​​-1.9.2-p180 时遇到了同样的问题,我尝试将 RubyGems 降级到不同的版本,直到 1.5.3,我的 RVM 内爆了……我在网上看了很多答案,这个问题似乎经常出现,但对我没有任何帮助。

提前感谢您的帮助!

【问题讨论】:

  • 当你尝试一个简单的 : gem install bcrypt-ruby 会发生什么?
  • 日志文件/usr/local/rvm/scripts/rvm/gems/ruby-1.9.2-p290@app/gems/bcrypt-ruby-3.0.0/ext/mri/gem_make.out包含什么?
  • gem install bcrypt 与任何 gem install 一样适用于带有无法自行安装的本机扩展的 gem。所以我可以手动实现我的目标,但是自动化部署并不容易......
  • 嗯,这确实是一个棘手的问题......我刚刚创建了一个新的 gemset 来重现这个问题。 Bundle 几乎安装了所有的 gem,但它终于在 unicorn 上再次遇到问题,这是最后一个......同样的错误消息,文件的内容没有多大帮助:/usr/local/rvm/scripts/rvm/rubies/ruby-1.9.2-p290/bin/ruby extconf.rb
  • 我遇到了同样的问题。你找到解决办法了吗?

标签: ruby-on-rails-3 rubygems rvm bundler


【解决方案1】:

这可能是由于编译本机扩展的内存不足。根据我的经验,bundle install 比简单地使用 gem install 更占用内存。查看/var/log/messages 并查看是否存在任何此类问题。此外,使用top 来识别任何重量级进程,例如让rails console 在屏幕会话中运行的同事。 ;)

【讨论】:

  • 我错过了你的回答。这似乎是一个很好的解释,但是我不再在 Amazon AWS AMI 上玩了,所以我无法深入调查。我希望你的回答可以帮助下一个面临这个问题的人......
  • 我可以确认我需要在 AMI 微型实例上创建交换文件,否则捆绑安装会失败。非常感谢!
  • 我可以进一步确认交换文件适用于我的类似问题 - 即。重型 c 扩展无法捆绑安装但成功安装 gem。在看到@LeonardoConstantino 的有用评论后,我使用valerio.della-porta.com/node/139 作为创建一个简单指南。
【解决方案2】:

如果您在 linux 上运行,则需要在安装 bcrypt-ruby gem 之前安装库/包。

sudo apt-get install ruby1.8-dev //对于 ruby​​ 1.8.7

sudo apt-get install ruby-dev

sudo apt-get install ruby1.9-dev //对于 ruby​​ 1.9.2

现在您可以使用以下命令安装 bcrypt-ruby gem

sudo gem install bcrypt-ruby

【讨论】:

  • 嗯,这不是由于依赖关系,否则它会在错误消息中说出来,而且当我运行gem install bcrypt 时它可以正常工作。任何带有本机扩展的 gem 都会失败,bcrypt 只是第一个。
  • bcrypt 和 bcrypt-ruby 不一样。bcrypt-ruby 使用不同的库。
  • 绝对与宝石本身无关。每当bundle install 崩溃时,只要我使用gem install 手动安装gem,下一个带有本机扩展的gem 就会导致bundle 崩溃...
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 2015-11-29
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多