2014-10-30 125 views
0

我使用的是Fedora 20,安装了Ruby 2.0和Rails 4.1.6。Fedora 20上的Ruby on Rails

我试图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。

+2

看起来像ruby头文件丢失。尝试通过YUM首先安装它们:'sudo yum install ruby​​-devel'接下来,您可能会遇到一些其他需要的devel软件包,例如'libxml2-devel'和数据库'sqlite3-devel'(和'mysql-devel'如果你打算使用MySQL) – 2014-10-30 18:52:32

+0

这是RHEL的一个可比较的问题http://stackoverflow.com/questions/18918588/did-i-install-ruby-1-9-3-correctly-on-rhel虽然,你赢了' t想要'ruby193-devel'软件包,而在Fedora上使用简单的'ruby-devel',它提供了Ruby 2.0 – 2014-10-30 19:08:09

回答

0

改为使用RVM

如果您还是新手,它可以让您选择不同的版本和环境进行试验。

+0

所有与缺少开发头文件('-devel' RPM软件包)相关的问题都将在RVM中遇到。更甚至,因为Ruby本身需要编译。不是说当RVM最初被整理出来并且在平台上被很好地理解时,RVM不是一个好的解决方案... – 2014-10-30 18:56:25

+0

@MichaelBerkowski,你是说'不要说RVM不是一个好的解决方案,当Ruby最初是在一个平台上进行整理和理解的......'? – blelump 2014-10-30 20:03:50

+0

@blelump我的意思是,一旦你了解如何让Ruby,Rails和Rubygems在没有它的平台上正常工作,RVM就是一个很好的解决方案。但在我看来,即使能够启动一个简单的'rails new',在引入RVM的时候也会遇到麻烦。 – 2014-10-30 20:19:14

0

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

其他几个gem也会出现同样的问题,但除非gem使用本机扩展(即需要编译的C代码),否则不会导致bundle失败。因此,json gem未能安装,但其他gem将成功安装(从rubygems,而不是从yum)。

此问题是discussed in depth on Github,不幸的是it has no easy solution,而不是涉及Bundler的问题。 Bundler旨在确保在给定Gemfile/Gemfile.lock的情况下,无论正在运行的系统是否安装了所给的gem版本。

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

1

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

系统包实际上解决这个问题,但你需要在你的的Gemfile来锁定它的版本。

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

# yum install rubygem-rails 

将安装Rails为您服务。但是,因为你将最有可能安装一些其他的宝石或他们的新版本,安装Ruby的头文件,以及通过安装ruby-devel包:

# yum install ruby-devel 

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

0

刚刚在项目的根目录下运行bundle update