2014-10-30 110 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