0

I am using Fedora 20 and installed Ruby version 2.0 and Rails version 4.1.6.

I tried rails new example but got this error:

Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Using rake 10.3.2
Using i18n 0.6.11

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /usr/bin/ruby extconf.rb 
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h


Gem files will remain installed in /home/sntr/.gem/ruby/gems/json-1.8.1 for inspection.
Results logged to /home/sntr/.gem/ruby/gems/json-1.8.1/ext/json/ext/generator/gem_make.out
An error occurred while installing json (1.8.1), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.1'` succeeds before bundling.
         run  bundle exec spring binstub --all
bundler: command not found: spring
Install missing gem executables with `bundle install`

I tried gem install json -v '1.8.1' or sudo yum install json ... but it didn't change, I couldn't run Rails.

4

4 回答 4

1

我试过 gem install json -v '1.8.1' 或 sudo yum install json ...但它没有改变,我无法运行 Rails。

系统包实际上可以解决问题,但您需要将其版本锁定在Gemfile中。

也许你不知道,但是整个 Ruby on Rails 框架其实是打包好的,所以运行:

# yum install rubygem-rails

将为您安装 Rails。但是由于您很可能会安装其他一些 gem 或其更新版本,因此请通过安装ruby-devel包来安装 Ruby 头文件:

# yum install ruby-devel

使用系统 Ruby 包实际上是一个不错的选择,它易于安装并为您提供安全更新等。仅当您需要操作系统未提供的其他 Ruby 版本时,使用 Ruby 版本管理器才会对您有所帮助。

于 2015-07-03T12:27:28.400 回答
0

请改用RVM

如果您还是新手,它为您提供了尝试不同版本和环境的选项。

于 2014-10-30T18:55:26.413 回答
0

这里的问题是,如果 ruby​​gems.org 提供了较新的版本,bundler 不会使用系统 ruby​​gems。因此,即使您从 Fedora 软件包安装了 ruby​​gem-json,例如它是 1.8.1 版,它也会被忽略,因为 1.8.2 版在 ruby​​gems 中。

其他几个 gem 也会出现同样的问题,但不会导致捆绑失败,除非 gem 使用本机扩展(即需要编译的 C 代码)。因此 json gem 无法安装,但其他 gem 将成功安装(来自 ruby​​gems,而不是来自 yum)。

这个问题在 Github 上进行了深入讨论,不幸的是它没有简单的解决方案,也没有涉及到 Bundler。Bundler 旨在确保在给定 Gemfile/Gemfile.lock 的情况下,它会准确安装给定的 gems 版本,而不管它在什么系统上运行。

如果您必须只使用系统 gem,那么您需要使用 来创建您的应用程序rails new app --no-gemfile,自己安装所有必要的系统 gem,并记录它们是哪些 gem,以便以后可以重复 gem 安装以进行测试和部署。特别是,您的应用程序不会有 Gemfile 或 Gemfile.lock。通常,如果您正在为特定 OS 发行版(例如 RHEL 7)上的部署进行开发,并且无论如何只允许使用系统提供的软件包,您才需要这样做。这在企业软件开发中很常见。如果您不在这种情况下,您可能根本不应该使用系统 ruby​​ 或 ruby​​gems,而更喜欢 RVM。

于 2015-04-01T05:01:14.640 回答
0

只需bundle update在项目的根目录下运行

于 2017-08-09T18:53:55.177 回答