通过 RVM 在 Ubuntu、Ruby 1.9.2 上安装使用本机扩展的 gem 时出错

Posted

技术标签:

【中文标题】通过 RVM 在 Ubuntu、Ruby 1.9.2 上安装使用本机扩展的 gem 时出错【英文标题】:Error installing gems that use native extensions on Ubuntu, Ruby 1.9.2 via RVM 【发布时间】:2011-07-04 22:02:28 【问题描述】:

我在尝试安装 ffi gem 时遇到错误:

~ - 16:54>gem i ffi
Building native extensions.  This could take a while...
ERROR:  Error installing ffi:
        ERROR: Failed to build gem native extension.

        rake RUBYARCHDIR=/home/mdemare/.rvm/gems/ruby-1.9.2-p136/gems/ffi-1.0.6/lib RUBYLIBDIR=/home/mdemare/.rvm/gems/ruby-1.9.2-p136/gems/ffi-1.0.6/lib
/home/mdemare/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/rubygems.rb:370:in `bin_path': can't find gem rake ([">= 0"]) with executable rake (Gem::GemNotFoundException)
        from /home/mdemare/.rvm/gems/ruby-1.9.2-p136/bin/rake:19:in `<main>'

Gem files will remain installed in /home/mdemare/.rvm/gems/ruby-1.9.2-p136/gems/ffi-1.0.6 for inspection.
Results logged to /home/mdemare/.rvm/gems/ruby-1.9.2-p136/gems/ffi-1.0.6/gen/gem_make.out

在安装带有本机扩展的 gem 时,我经常遇到各种错误,所以我认为我的 Ubuntu 安装有问题,但我不知道是什么。我会发布您诊断问题所需的任何信息。

编辑:当我 cd 到 ffi gem(在第二行但最后一行中提到)并在第 6 行运行 rake 行时,我得到“找不到 RubyGem rake-compiler”。

在 gem i rake-compiler 之后,再次运行 rake,我得到了这个:

configure: error: source directory already configured; run "make distclean" there first
make: *** [/home/mdemare/.rvm/gems/ruby-1.9.2-p136/gems/ffi-1.0.6/build/x86_64-linux/ffi_c/1.9.2/libffi/.libs/libffi_convenience.a] Error 1
rake aborted!
Command failed with status (2): [make...]

更新:

这些是我的 rake gemspecs:

~ - 10:59>find ~/.rvm/ -name 'rake-0.8.7.gemspec'
~/.rvm/gems/ruby-1.9.2-p136/specifications/rake-0.8.7.gemspec
~/.rvm/gems/ruby-1.9.2-p136@global/specifications/rake-0.8.7.gemspec
~/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/gems/1.9.1/specifications/rake-0.8.7.gemspec

最后一个是 gem 的外观,但 gemspec 与第一个不同,并且不包含可执行文件。复制长文件并不能完全解决问题 - 我得到一个找不到 rake 可执行文件的文件。

【问题讨论】:

您找到解决方案了吗?我在使用ruby-1.9.2-p180 时遇到了完全相同的错误。是的,rake 已安装(通过 rvm) 不,仍然不知道发生了什么,不是很紧急,但我想让 rbprofile 运行。 【参考方案1】:

安装程序尝试运行 rake,但找不到时失败:

can't find gem rake ([">= 0"]) with executable rake (Gem::GemNotFoundException)

您需要安装 rake gem:gem install rake

【讨论】:

它已经安装了,很明显 - 消息甚至来自 rake,正如您在堆栈跟踪中看到的那样。【参考方案2】:

我遇到了类似的问题,http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=529663 的解决方法帮助了我。 简而言之,尝试使用以下命令安装 gem: $ rake=/usr/bin/rake gem install ffi

【讨论】:

【参考方案3】:

这让我在波士顿黑客日尝试安装 Vagrant(FFI 是依赖项)时非常恼火。我最终浪费了很多时间,以至于我换了机器来解决这个问题。

事后,我发现了一个可行的方法(尽管我确信有更好的解决方案)。错误消息所抱怨的文件

~/.rvm/gems/ruby-1.9.2-p180/bin/rake

与其他类似副本的不同之处在于它在头部缺少路径设置内容,因此我从包含它们的文件之一复制了这些行:

[根据下面@danv 的回答进行了通用化。感谢改进!]

ENV['GEM_HOME']=ENV['GEM_HOME'] || '~/.rvm/gems/ruby-1.9.2-p180'
ENV['GEM_PATH']=ENV['GEM_PATH'] || '~/.rvm/gems/ruby-1.9.2-p180:~/.rvm/gems/ruby-1.9.2-p180@global'
ENV['PATH']='~/.rvm/gems/ruby-1.9.2-p180/bin:~/.rvm/gems/ruby-1.9.2-p180@global/bin:~/.rvm/rubies/ruby-1.9.2-p180/bin:' + ENV['PATH']

这为我解决了问题。这是一个新的 Ubuntu 10.10 安装,没有默认的 Ruby 安装(这可能是问题的一部分)和使用 RVM 安装的 Ruby 1.9.2。许多其他 gem 安装得很好,包括那些需要本地编译的,所以问题是 FFI 特有的。

【讨论】:

谢谢!有一天,我想弄清楚根本问题是什么,但这浪费了我太多时间。 也适用于我的情况。谢谢。 在看到 Docunext 的评论之前,我做了 Docunext 所做的事情。很有魅力!【参考方案4】:

@Tom Morris - 尝试了你的方法,效果很好。

我在第 12 行之后将您的路径规范(已修改 - 见下文)插入 ~/.rvm/gems/ruby-1.9.2-p180/bin/rake。

我修改了路径规范,因此它们是通用的,使用 ~ 用于用户主页:

ENV['GEM_HOME']=ENV['GEM_HOME'] || "~/.rvm/gems/ruby-1.9.2-p180"
ENV['GEM_PATH']=ENV['GEM_PATH'] || "~/.rvm/gems/ruby-1.9.2-p180:~/.rvm/gems/ruby-1.9.2-p180@global"
ENV['PATH']="~/.rvm/gems/ruby-1.9.2-p180/bin:~/.rvm/gems/ruby-1.9.2-p180@global/bin:~/.rvm/rubies/ruby-1.9.2-p180/bin:"+ ENV['PATH']

感谢您找到此修复程序!

【讨论】:

很高兴听到它奏效了。谢谢你的建议。我编辑了代码 sn-p 以使其更加通用(我只是快速而懒惰地剪切/粘贴那里的内容)。【参考方案5】:

感谢@Tim Morris 和@danv,您的回答/cmets 提供了帮助。我调整了我的设置,它更基于超级用户环境。现在这是 /usr/local/rvm/gems/ruby-1.9.2-p180/bin/rake 在我的服务器上的样子:

require 'rubygems'

version = ">= 0"
ENV['GEM_HOME']=ENV['GEM_HOME'] || "/usr/local/rvm/gems/ruby-1.9.2-p180"
ENV['GEM_PATH']=ENV['GEM_PATH'] || "/usr/local/rvm/gems/ruby-1.9.2-p180:/usr/local/rvm/gems/ruby-1.9.2-p180@global"

if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  version = $1
  ARGV.shift
end

gem 'rake', version
load Gem.bin_path('rake', 'rake', version)

【讨论】:

以上是关于通过 RVM 在 Ubuntu、Ruby 1.9.2 上安装使用本机扩展的 gem 时出错的主要内容,如果未能解决你的问题,请参考以下文章

关于怎么在ubuntu ternimal中创建ruby程序命令行接口

使用 rvm 安装最新的 RUBY 在 Ubuntu 上会出错

使用 RVM 安装 Ruby 1.9.2 时出现 Curl 证书错误

使用 RVM 安装 Ruby 1.9.3 但命令行不显示 ruby​​ -v

在 Ubuntu 14.04 上使用 RVM 安装 Ruby 2.2.2 时出错

如何使用 rvm 将我的 ruby​​ 1.9.2-p0 升级到最新的补丁级别?