Проблемы с Ruby on Rails и Rake: неинициализированная константа Rake :: DSL


189

У меня действительно расстраивающая проблема: Грабли глупы.

Вот как возникает проблема:

$ rails new test_app
$ rails generate scaffold new_scaffold field1:string field2:text

Оба из них работают просто отлично, но потом, когда я делаю это,

$ rake db:migrate

Я получаю следующую ошибку.

(in /home/mikhail/test_app)
rake aborted!
uninitialized constant Rake::DSL
/usr/lib/ruby/1.9.1/rake.rb:2482:in `const_missing'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:6:in `<module:Rake>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:3:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `require'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `load'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `block in <top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `each'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `initialize_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:139:in `load_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:77:in `method_missing'
/home/mikhail/test_app/Rakefile:7:in `<top (required)>'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/bin/rake:31:in `<main>'

Я искал в Интернете аналогичные / те же ошибки, и люди их имели. Просто никто, кажется, никогда не решит проблему!

Как мне решить эту проблему?

Ответы:


193

Твит от DHH ранее. Рейк .9.0 ломает Rails и несколько других вещей, которые вам необходимо:

gem "rake", "0.8.7"

в вашем Gemfile.


17
Это сработало для меня. Мне нужно было сделать bundle update rakeпервым. Тогда я проверил с bundle show rake. Стоит сказать 0.8.7. Потом rake db:migrate.
B семь

26
Или еще лучше gem "rake", "!= 0.9.0". Это позволяет избежать испорченного выпуска 0.9.0, но будет обновляться до более нового, когда будет опубликован более свежий выпуск (удаление этого позже не повредит, но и сохранение его не должно повредить).
Спиралис

6
@Spiralis Я также столкнулся с проблемой с версией 0.9.2. Поэтому вам, возможно, придется добавить эту строку для нескольких версий.
Dharmatech

3
это решение работало на меня. Как и @dharmatech, у меня возникла эта проблема, heroku rake db:migrateи это, похоже, исправило ее. не забудьте добавить и зафиксировать эти изменения в git, прежде чем продолжить;)
pruett

1
Это может работать для Rails, но я также должен был sudo gem install rakeубедиться, что rakeверсия, которую я вызывал из командной строки, не была 0.8.7.
Autumnsault

72

Я сделал некоторые исследования сразу после моего предыдущего ответа (извините, я должен сделать до этого).

Все проблемы решены с помощью Rake Gem 0.9.2. Я выполнил следующие действия:

  • Я установил gem install rake -v=0.9.2 (у меня был драгоценный камень 0.9.1)
  • удалил 0.9.1 с gem uninstall rake -v=0.9.1
  • обновлено с bundle update
  • затем db:migrateпоказал предупреждение,WARNING: Global access to Rake DSL methods is deprecated. Please....

    Это было решено добавлением следующего в файл Rake.

    module ::YourApplicationName  
      class Application
        include Rake::DSL
      end
    end
  • Я опустил module ::RakeFileUtils extend Rake::FileUtilsExtendопцию, предложенную @databyte.

Это означает, что Rake Gem 0.9.2 работает отлично!


Последовали первые три шага, и я не получил предупреждения, поэтому не стал беспокоиться об остальном, спасибо за предложение!
Абе Петрильо,

1
Это заставляет меня спросить ... Почему я должен взломать Rake, чтобы сохранить эту функцию? Что Rake пытается сделать и что мне теперь использовать?
Ryanmt

@Arrumaco, какой каталог для файла Rake?
Cтак

Стоит отметить, что дополнение к этому RakeFileдолжно быть раньше require 'rake'- поймали меня :)
Ciaran Archer

12
тот же вопрос, но у меня уже были грабли (0.9.2, 0.8.7). Переустановка 0.9.2, кажется, решает проблему, хотя: 1) gem uninstall rake -v=0.9.22)gem install rake -v=0.9.2
DK.

54

Проходя главу 2 Railstutorial (demo_app) и столкнулся с этой проблемой. Я попробовал все остальные ответы, перечисленные здесь, но не смог заставить его работать, пока я не сделал это:

Поместите это в ваш Rakefile выше, для этого требуется 'rake'

require 'rake/dsl_definition'

через Как исправить проблему неинициализированной константы Rake :: DSL на Heroku?

Я также подтвердил и отправил все файлы в Github и Heroku.


Это кажется лучшим ответом, поскольку понижение с 0.9.2 до 0.8.7 нарушило бы некоторые зависимости гемов в зависимости от каждого случая, например моего :) Спасибо!
ДиегоСалазар

Это не работает для меня. Я получаю "нет такого файла для загрузки - rake / dsl_definition" при выполнении rake db: create
KMC

25

Все, что мне нужно было сделать, это использовать:

gem install rake

У меня уже была версия 0.9.2, просто нужно было установить.


вау это сработало для меня Но не могли бы вы объяснить, почему я должен устанавливать грабли, а грабли должны быть уже там?
KMC

На самом деле я еще не эксперт, но, насколько я понимаю, есть разница между «установкой» гемов на ваш ПК и «установкой» их в реестре гемов - я подозреваю, что это потому, что для установки Ruby необходимо знать, какие гемы где на вашем компьютере. Возможно, это то, что может быть автоматизировано в будущем или уже автоматизировано в определенных дистрибутивах Ruby ...
Branstar

19

Переустановите грабли, и он должен работать нормально:

gem uninstall rake -v=0.9.2 
gem install rake -v=0.9.2

Если нет, укажите версию '0.8.7' в вашем Gemfile.


этот подход работал для меня, и я предпочел не понижать версию ..
Tarnschaf

У меня тоже сработало, только для рейка -v 0.9.2.2
Haspemulator

10

Если не используете Bundler:

sudo gem install rake -v 0.8.7
sudo gem uninstall rake

Затем выберите удалить 0.9.0.


это исправило это для меня без связки (рельсы 2.3.8). Попытался установить грабли 0.9.2, но это не помогло. Установка 0.8.7 и удаление 0.9.2 были тем, что наконец-то сработало для меня.
Майкл Даррант

8

Если, как и я, вы застряли на рейке 0.8.7 и используете Rails 3.2.x, то в railties добавлено требование для Rake :: DSL

Чтобы решить эту проблему, в начало вашего Rakefile вы должны добавить:

module Rake
  module DSL
  end
end

7

Я решил ту же проблему с помощью следующих шагов:

В Gemfile:

gem 'rake', '0.9.2'

Затем запустил это на консоли:

sudo bundle update rake

Затем добавил следующие строки в Rakefile:

require 'rake/dsl_definition'
include Rake::DSL

6

Rails 3.1.rc1 был обновлен. Для ваших собственных файлов Rake вы можете добавить это перед вызовом load_tasks.

module ::YourApplicationName
  class Application
    include Rake::DSL
  end
end

module ::RakeFileUtils
  extend Rake::FileUtilsExt
end

https://gist.github.com/4cd2bbe68f98f2f0249f

ОБНОВЛЕНИЕ: Также заметил, что здесь уже есть ответ: неопределенный метод 'task' с использованием Rake 0.9.0


4

У меня была та же проблема, и я должен был использовать рейк на 0.8.7 вместо 0.9.0.


4

Я пользователь Windows XP и у меня была такая же проблема.

Я ввел gem "rake", "0.8.7" в gemfile, а затем набрал следующее в командном окне.

bundle update rake

Это исправило мою проблему.


работал для меня тоже, с сегодняшнего дня. просто пытаюсь кодировать рельсы на Win7.
Арскариос

4
  1. Перейти к пути вашего проекта
  2. Тип bundle install --path=vendor/bundle
  3. Тип bundle exec rake db:migrate

Для запуска сервера наберите bundle exec rails s. Используйте bundle exec, и вы будете уверены, что используете правильные гемы (необходимая версия) для вашего проекта. Также я бы порекомендовал вам добавить vendor/bundleв, .gitignoreесли вы используете gitи сделать псевдоним для bundle exec. Если вы используете, zshвы можете следовать этому подходу


3

То же, что Бранстар выше - спасибо, Бранстар!

  • ОС: Windows Vista
  • Уровень: совершенно новый для Ruby on Rails
  • У меня уже был установлен Ruby 1.9.2

Я следовал инструкциям в Running Rails 3 для Windows .

Все работало до части "rake db: migrate", которая дала мне тот же результат, что и оригинальная запись.

Я побежал:

gem install rake

Я снова побежал:

rake db:migrate

Тогда я смог запустить сервер Ruby on Rails, и все было готово.

Еще раз спасибо, Бранстар :-)


2

Я чувствую к тебе (mikhailvs), это действительно расстраивает. Я схожу с ума почти один полный день. Я даже удалил Ruby и все зависимые от него файлы и выключил компьютер, но у меня все еще возникла та же проблема.

Что я получил из сообщения об ошибке - проблема с Rake 0.9.2. Кажется, что он не был полностью установлен. Так что пришлось переустанавливатьgem install rake -v=0.9.2

Я не был уверен, установлен ли у меня рейк -v0.9.1. Поэтому, чтобы убедиться, что я в безопасности, я попытался удалить эту старую версию с gem uninstall rake -v=0.9.1. Но это показывает мне сообщение об ошибке

ERROR:  While executing gem ... (Gem::InstallError)
    cannot uninstall, check `gem list -d rake`

Итак, я проверил все каталоги Rake на моем компьютере и обнаружил, что у меня был только Rake 0.9.2. Затем, чтобы проверить, все ли прошло хорошо, я мигрировал с rake db:migrate. И это сработало :)

Я думаю, что у меня не было Rake 0.9.1, потому что я чисто установил Ruby ( rubyinstaller-1.9.2-p180 - в моей системе Windows 7) и все гемы. Тем временем Rake 0.9.2 не был полностью установлен.


2

Удаление с помощью "gem uninstall rake" работало для меня, у меня было установлено 2 версии, поэтому я просто сделал чистую переустановку.

"rake db: create" , чтобы убедиться, что база данных существует, а затем "rake db: migrate", чтобы заключить сделку.


2

У меня была такая же проблема с использованием Rake 0.9.2.2. Я решил эту проблему с помощью комплекта Exec.



0

Установите грабли 0.8.7 и удалите 0.9.2.2

$ gem install rake -v 0.8.7
$ gem uninstall rake -v 0.9.2.2

Сейчас использую

$ bundle exec rake db:migrate

я думаю это тебе поможет;)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.