Fedora 20上的Ruby on Rails

时间:2014-10-30 18:50:01

标签: ruby-on-rails ruby json fedora20

我正在使用Fedora 20并安装了Ruby 2.0和Rails版本4.1.6。

我尝试了rails new example,但收到了这个错误:

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`

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

4 个答案:

答案 0 :(得分:1)

  

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

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

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

# yum install rubygem-rails

将为您安装Rails。但由于您最有可能安装其他一些宝石或其新版本,因此安装Ruby头文件也需要安装ruby-devel包:

# yum install ruby-devel

使用系统Ruby包实际上是一个很好的选择,易于安装,并提供安全更新等。只有当您需要操作系统未提供的其他版本的Ruby时,使用Ruby版本管理器才能帮助您。

答案 1 :(得分:0)

改为使用RVM

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

答案 2 :(得分:0)

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

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

这个问题是discussed in depth on Github,不幸的是it has no easy solution,而不是涉及Bundler的问题。 Bundler旨在确保在给定Gemfile / Gemfile.lock的情况下,无论运行什么系统,它都会安装所给出的gems版本。

如果您必须仅使用系统宝石,那么您需要使用rails new app --no-gemfile创建应用,自行安装所有必要的系统宝石,然后记录文档它们是宝石,以便以后可以重复进行宝石安装以进行测试和部署。特别是,您的应用将具有Gemfile或Gemfile.lock。通常,如果您正在开发特定操作系统分发(例如RHEL 7)上的部署,并且只允许使用系统提供的软件包,则只​​需执行此操作。这在企业软件开发中很常见。如果您不在这种情况下,您可能根本不使用系统ruby或rubygems,并且更喜欢RVM。

答案 3 :(得分:0)

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