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

101

Я получаю ошибки, похожие на те , что указаны в этих вопросах , за исключением того, что мои возникают на Heroku :

2011-05-30T09:03:29+00:00 heroku[worker.1]: Starting process with command: `rake jobs:work`
2011-05-30T09:03:30+00:00 app[worker.1]: (in /app)
2011-05-30T09:03:30+00:00 heroku[worker.1]: State changed from starting to up
2011-05-30T09:03:33+00:00 app[worker.1]: rake aborted!
2011-05-30T09:03:33+00:00 app[worker.1]: uninitialized constant Rake::DSL
2011-05-30T09:03:33+00:00 app[worker.1]: /app/.bundle/gems/ruby/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'

Ответ на эти вопросы, кажется, состоит в том, чтобы указать gem 'rake', '0.8.7' потому что версия 0.9 вызывает проблему.

Когда я пытаюсь добавить gem 'rake', '0.8.7'в свой гем-файл и нажимать на Heroku, я получаю такую ​​ошибку:

Unresolved dependencies detected; Installing...
You have modified your Gemfile in development but did not check
the resulting snapshot (Gemfile.lock) into version control

You have added to the Gemfile:
* rake (= 0.8.7)
FAILED: http://devcenter.heroku.com/articles/bundler
! Heroku push rejected, failed to install gems via Bundler
error: hooks/pre-receive exited with error code 1
To git@heroku.com:my_app.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:my_app.git'

Мой гемфайл нормально работает на Heroku. Что я должен делать?

Бен
источник
Вы пробовали ответ №3, который вы опубликовали? Что произошло после внесения этих изменений?
Забба

Ответы:

205

Поместите это в свой Rakefile выше require 'rake':

require 'rake/dsl_definition'
Капуста
источник
3
Спасибо. Это устранило мои проблемы, и я не знал, что происходит. (Использование установщика rails в Windows и развертывание в heroku, как полный новичок.)
Джек В.
1
работает ли это решение в Windows, потому что я все еще получаю ту же ошибку - неинициализированная константа Rake :: DSL
Дэвид
2
Я получил ошибку при развертывании на Heroku, который сегодня вытащил rake 0.9.2. Поскольку исходная проблема была с версией 0.9.0, возможно, версия с граблями больше не проблема. Добавление requireстроки в rakefile (а также повторное выполнение и повторная отправка в github и Heroku) решило эту проблему. @David, я использую Windows с фреймворком RoR от RailInstaller 1.2.0.
Марк Берри
Что ж, вам нужно обновить грабли до 0.9.2, чтобы это работало. Удачи!
RubyFanatic
Я получаю эту ошибку при выполнении rake db: create, «нет такого файла для загрузки - rake / dsl_definition»
KMC
8

Каждый раз, когда вы меняете свой Gemfile, вам необходимо bundle installобновить файл блокировки (Gemfile.lock). Ошибка, которую вы получаете при нажатии, не связана с изменением версии рейка.

bundle install
git commit -a -m "update lockfile"
git push heroku master

Обратите внимание на полученное сообщение об ошибке:

Вы изменили свой Gemfile в процессе разработки, но не проверили полученный снимок (Gemfile.lock) в системе контроля версий.

Wuputah
источник
1
Возможно, вам потребуется запустить «rake обновления пакета», чтобы регенерировать Gemfile.lock.
Jan Hettich
6

Я решил это, наконец, после долгих размышлений. Краткая версия того, что я сделал, без множества экспериментов, была такова:

1) измените Gemfile, указав Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Уберите хак, который я ранее добавил в Rakefile на основе вопроса о переполнении стека. Проблемы с Ruby on Rails и Rake: неинициализированная константа Rake :: DSL. :

Итак, мой Rakefile теперь снова стал стандартным Rakefile для моего приложения:

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
require 'rake'

MyApp::Application.load_tasks

3) Измените Heroku для запуска моего приложения в Ruby 1.9.2:

heroku stack:migrate bamboo-mri-1.9.2 --app myapp
git push heroku master

И теперь вроде нормально - запланированная задача cron все равно выполняется.

EDIT: Это было прекрасно работать, один раз, а затем взорвали в следующий раз я нажал что - то! Arrgh. Думаю, я исправил это сейчас, delayed_jobдобавив драгоценный камень, на основе разговора. Не знаю, как создавать задания: работа .

Установка delayed_jobне кажется отличным решением, но она сработала, и я думаю, что когда-нибудь я захочу ее использовать, особенно с раз в час cron в Heroku (что просто недостаточно часто - есть вещи, которые я возможно, захочется запускать каждые пять минут). После того, как я установил delayed_jobгем, мне пришлось выполнить его настройку, иначе Heroku жалуется на отсутствие delayed_jobsтаблицы:

#add to gemfile
gem 'delayed_job'

#at command line
bundle install
rails g delayed_job
rake db:migrate
git add -A
git commit -a -m "added delayed_job gem"
git push
heroku rake db:migrate --app myapp
heroku restart --app myapp
Макс Уильямс
источник
1

У меня было приложение Rails 3.0.11, в котором была указана версия 0.8.7 rake в Gemfile, чтобы обойти проблему Rake :: DSL версии 0.9.2.

После того, как я преобразовал приложение в Rails 3.2.0 (стек Heroku Cedar), у меня возникла проблема со сбоем рабочего (задача с граблями). Я изменил «gem 'rake', '0.8.7'» на «gem 'rake'», который включал rake версии 0.9.2.2. Рабочий перестал падать с новой версией.

Уэс
источник
0

Ваша проблема вызвана тем, что Gemfile.lockфайл не был удален, и не относится к Heroku. Удаление Gemfile.lockдолжно решить эту проблему, но приведет вас сразу к другой:

To git@heroku.com:tailored-landing-pages.git
 * [new branch]      master -> master
manfred@painstation2:~/Desktop/projects/ror/ta/tlp307$ heroku rake db:migrate
rake aborted!
ninitialized constant Rake::DSL
/app/Rakefile:13:in `<class:Application>'
/app/Rakefile:12:in `<module:Tlp307>'
/app/Rakefile:11:in `<top (required)>'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/ruby1.9.2/bin/rake:31:in `<main>'

К сожалению, я пока не нашел решения этой проблемы, поскольку понижение версии Rake до 0.8.7 здесь не работает. Если у кого-то еще есть ответ, я был бы очень признателен.

Клаффенбок
источник
4
Я бы никогда не рекомендовал удалять ваш файл блокировки.
wuputah
2
Удаление Gemfile.lock приведет к установке всех последних версий всех драгоценных камней при каждом развертывании в heroku (если вы не закрепите все версии в Gemfile).
Климент Мамыкин