构建本机扩展时出错会阻止非 sudo 命令工作

Error building native extensions prevents non-sudo command working

我正在升级现有设置以使用 Rails 5 beta 3。作为其中的一部分,我已将 Ruby 升级到版本 2.2.4(使用 RVM),即

rvm install 2.2.4
rvm use 2.2.4

完成后,我正在尝试安装 Rails gem。然而,运行

sudo gem install rails

给我错误

ERROR: Error installing mime-types-data: mime-types-data requires Ruby version >= 2.0.

读完 ,我查看了我的 Ruby 版本:

ruby --version   =>   ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux]
sudo ruby --version   =>   ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

我似乎无法从 sudo 访问 RVM,所以我尝试使用 gem install rails,但在构建本机扩展时也失败了:

Building native extensions.  This could take a while...
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    /home/ubuntu/.rvm/rubies/ruby-2.2.4/bin/ruby -r ./siteconf20160405-31973-l7bzq7.rb extconf.rb
checking if the C compiler accepts ... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/home/ubuntu/.rvm/rubies/ruby-2.2.4/bin/$(RUBY_BASE_NAME)
        --help
        --clean
/home/ubuntu/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /home/ubuntu/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/mkmf.rb:571:in `block in try_compile'
        from /home/ubuntu/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/mkmf.rb:522:in `with_werror'
        from /home/ubuntu/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/mkmf.rb:571:in `try_compile'
        from extconf.rb:80:in `nokogiri_try_compile'
        from extconf.rb:87:in `block in add_cflags'
        from /home/ubuntu/.rvm/rubies/ruby-2.2.4/lib/ruby/2.2.0/mkmf.rb:619:in `with_cflags'
        from extconf.rb:86:in `add_cflags'
        from extconf.rb:336:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /home/ubuntu/.rvm/gems/ruby-2.2.4/gems/nokogiri-1.6.7.2 for inspection.
Results logged to /home/ubuntu/.rvm/gems/ruby-2.2.4/extensions/x86_64-linux/2.2.0/nokogiri-1.6.7.2/gem_make.out

我看到了两个解决方案:

  1. sudo 命令中使用的 Ruby 升级到 2.0 或更高版本(最好是 2.2.4)。我不知道该怎么做,因为 sudo rvm 导致 command not found for rvm.
  2. 修复使用gem install rails时出现的错误。同样,我不知道该怎么做。

哪一个最简单(或者有更简单的解决方法),我该怎么做?

您似乎已经在单用户模式下安装了 RVM。这就是为什么 sudo rvm returns command not found 错误的原因。您可以在此处找到有关 RVM 模式的更多信息:https://rvm.io/rvm/install#2-load-rvm-into-your-shell-sessions-as-a-function.

但是,根据您提供的日志,错误是在安装 Nokogiri 时。请先使用命令 sudo apt-get install ruby-dev zlib1g-dev liblzma-dev 安装开发头文件。详情如下:http://www.nokogiri.org/tutorials/installing_nokogiri.html

您调用的 sudo 命令将作为 root 用户执行,因此它不会加载您的配置文件设置(这是加载 rvm ruby 版本的地方,如果它有效就像我使用的 rbenv,从未使用过 rvm)

另一方面,当安装 gem 时 Building native extensions 失败时,这意味着您需要开发包 (C/C++头文件)对于一个真正完成整个事情的库(ruby gems 通常是它的包装器),所以例如,如果你想构建 ruby 你将需要来自 linux 发行版的 ruby 开发包(如果您使用 OSX,则需要来自 brew),来自 postgres 的开发包用于构建 pg gem,等等