Ruby on Rails на Fedora 20
Я использую 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 ответа
Я пытался установить gem json -v '1.8.1' или sudo yum install json ... но ничего не изменилось, я не смог запустить Rails.
Системный пакет на самом деле решит проблему, но вам нужно будет заблокировать его версию в вашем Gemfile.
Возможно, вы этого не знаете, но вся среда Ruby on Rails на самом деле упакована, поэтому выполняется:
# yum install rubygem-rails
установит Rails для вас. Но поскольку вы, скорее всего, будете устанавливать некоторые другие гемы или их более новые версии, установите также заголовочные файлы Ruby, установив ruby-devel
пакет:
# yum install ruby-devel
Использование системного пакета Ruby на самом деле является хорошим выбором, который прост в установке и, помимо прочего, предоставляет вам обновления безопасности. Использование менеджера версий Ruby поможет вам только в том случае, если вам нужна другая версия Ruby, не предоставляемая вашей ОС.
Вместо этого используйте RVM.
Если вы все еще новичок, это дает вам возможность экспериментировать с различными версиями и средами.
Проблема здесь в том, что упаковщик не использует системные rubygems, если более новые версии доступны на rubygems.org. Таким образом, даже если у вас установлен пакет rubygem-json из пакетов Fedora, например, если это версия 1.8.1, он будет проигнорирован, поскольку версия 1.8.2 представлена в rubygems.
Та же проблема возникает с несколькими другими драгоценными камнями, но не приводит к сбою пакета, если драгоценный камень не использует собственные расширения (то есть код C, который должен быть скомпилирован). Таким образом, не удалось установить гем json, но другие гемы будут установлены успешно (из rubygems, а не из yum).
Эта проблема подробно обсуждалась на Github, и, к сожалению, она не имеет простого решения, и не имеет отношения к Bundler. Bundler предназначен для обеспечения того, чтобы, учитывая Gemfile/Gemfile.lock, он устанавливал именно те версии самоцветов, которые не указаны, независимо от того, на какой системе он работает.
Если вы должны использовать только системные гемы, то вам нужно создать приложение с rails new app --no-gemfile
, установите все необходимые системные гемы самостоятельно и запишите, какие они гемы, чтобы потом повторить установку гемов для тестирования и развертывания. В частности, ваше приложение не будет содержать Gemfile или Gemfile.lock. Как правило, это нужно делать только в том случае, если вы разрабатываете для развертывания в конкретном дистрибутиве ОС (например, RHEL 7) и в любом случае разрешено использовать только системные пакеты. Это достаточно часто встречается в разработке программного обеспечения предприятия. Если вы не в этом сценарии, вам, вероятно, вообще не следует использовать системный рубин или рубины, а предпочитать RVM.