【问题标题】:Ruby on Rails on Fedora 20Fedora 20 上的 Ruby on Rails
【发布时间】:2014-10-30 18:50:01
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 看起来缺少 ruby​​ 标头。尝试先通过 YUM 安装它们:sudo yum install ruby-devel 之后,您可能会遇到一些其他需要的开发包,例如 libxml2-devel 和数据库 sqlite3-devel(如果您打算使用 MySQL,还有 mysql-devel
  • 这里有一个与 RHEL stackoverflow.com/questions/18918588/… 类似的问题,你不会想要 ruby193-devel 包,而是在 Fedora 上使用简单的 ruby-devel,它附带 Ruby 2.0

标签: ruby-on-rails ruby json fedora20


【解决方案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 版本管理器才会对您有所帮助。

【讨论】:

    【解决方案2】:

    请改用RVM

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

    【讨论】:

    • 所有与缺少开发头文件(-devel RPM 包)相关的问题都会在 RVM 中遇到。更甚,因为 Ruby 本身需要编译。并不是说 RVM 不是一个好的解决方案,当 Ruby 被初步整理并在平台上很好理解时......
    • @MichaelBerkowski,你说“并不是说 RVM 不是一个好的解决方案,当 Ruby 最初被整理出来并在平台上得到很好的理解时......”?
    • @blelump 我的意思是,一旦您了解了如何在没有它的情况下让 Ruby、Rails 和 Rubygems 在您的平台上正常工作,RVM 一个很好的解决方案。但在我看来,在启动简单的rails new 之前引入 RVM 是自找麻烦。
    • @MichaelBerkowski,RVM 知道安装 Ruby 所需的先决条件,并且会告诉用户,如果没有找到它们会安装它们。在一个裸 CentOS 虚拟机上,我刚刚安装了 RVM,然后告诉它安装 Ruby 2.1.4,RVM 说“安装所需的包:libyaml-devel、libffi-devel、autoconf、gcc-c++、readline-devel、zlib-devel , openssl-devel, automake, libtool, bison",然后正确编译 Ruby。然后使用 gem install rails 安装 Rails 没有问题。
    • @theTinMan 我在尚未准备好的机器上运行 rvm 的经验必须仅限于我没有 root/sudo 的环境,在没有 openssl-devel 的情况下 rvm 将失败,在 rhel 上非默认。上周刚刚被那个耽搁了
    【解决方案3】:

    这里的问题是,如果 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)。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-08-06
        • 1970-01-01
        • 2014-06-21
        • 2014-02-03
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多