Como consertar o problema Rake :: DSL constante não inicializado no Heroku?

101

Estou recebendo erros semelhantes aos que em estas perguntas , a não ser o meu estão ocorrendo em 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>'

A resposta nessas perguntas parece ser especificar gem 'rake', '0.8.7' porque a versão 0.9 causa o problema.

Quando tento adicionar gem 'rake', '0.8.7'ao meu gemfile e enviar para o Heroku, recebo este erro:

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 '[email protected]:my_app.git'

Meu gemfile normalmente funciona bem no Heroku. O que devo fazer?

ben
fonte
Você tentou a resposta nº 3 que postou? O que aconteceu depois de fazer essas alterações?
Zabba

Respostas:

205

Coloque isso em seu Rakefile acima, require 'rake':

require 'rake/dsl_definition'
Couve
fonte
3
Obrigado. Isso resolveu meus problemas e eu não sabia o que estava acontecendo. (Usando o instalador do Rails no Windows e implantando no Heroku, como um completo iniciante.)
Jack V.
1
esta solução funciona no Windows porque ainda estou recebendo o mesmo erro - constante não inicializada Rake :: DSL
David
2
Recebi o erro de implantação no Heroku, que hoje puxou o rake 0.9.2. Como o problema original era com 0.9.0, talvez a versão do rake não seja mais o problema. Adicionar a requirelinha ao rakefile (e recommitir e empurrar novamente para o github e Heroku) resolveu. @David, estou usando o Windows com a estrutura RoR do RailInstaller 1.2.0.
Mark Berry
Bem, você precisará atualizar para o rake 0.9.2 para que isso funcione. Boa sorte!
RubyFanatic de
Recebo este erro ao fazer rake db: create, "nenhum arquivo para carregar - rake / dsl_definition"
KMC de
8

Sempre que você alterar o Gemfile, será necessário bundle installatualizar o lockfile (Gemfile.lock). O erro que você está obtendo no push não é específico para alterar a versão do rake.

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

Observe a mensagem de erro que você recebeu:

Você modificou seu Gemfile em desenvolvimento, mas não verificou o instantâneo resultante (Gemfile.lock) no controle de versão

wuputah
fonte
1
Você pode precisar executar "bundle update rake" para regenerar Gemfile.lock.
Jan Hettich
6

Resolvi isso, finalmente, depois de muita bagunça. A versão resumida do que eu fiz, perdendo muitos experimentos, foi esta:

1) mude o Gemfile para especificar Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Retire um hack que eu tinha adicionado anteriormente ao Rakefile com base na questão do Stack Overflow Ruby on Rails e problemas com Rake: constante não inicializada Rake :: DSL :

Então, meu Rakefile voltou a ser o Rakefile padrão para meu aplicativo:

# 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) Altere o Heroku para executar meu aplicativo em Ruby 1.9.2:

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

E parece bom agora - a tarefa cron agendada está em execução de qualquer maneira.

EDIT: Ele fez correr bem, uma vez que, em seguida, explodiu novamente na próxima vez eu empurrei alguma coisa! Arrgh. Acho que consertei agora, com a adição da delayed_jobgema, com base na conversa Não sei como construir tarefas de trabalho: trabalho .

A instalação delayed_jobnão parece uma ótima solução, mas funcionou, e eu posso querer usá-la em algum momento, eu acho, especialmente com o cron job de uma vez por hora do Heroku (que simplesmente não é frequente o suficiente - há coisas que eu ' provavelmente vai querer ser executado a cada cinco minutos). Depois que instalei a delayed_jobgema, tive que fazer a configuração dela, caso contrário, o Heroku reclama da falta da delayed_jobsmesa:

#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
Max Williams
fonte
1

Eu tinha um aplicativo Rails 3.0.11, que especificava rake versão 0.8.7 no Gemfile para contornar o problema da versão 0.9.2 Rake :: DSL.

Depois de converter o aplicativo para Rails 3.2.0 (pilha Heroku Cedar), estava tendo um problema com o trabalhador (uma tarefa de rake) travando. Mudei "gem 'rake', '0.8.7'" para "gem 'rake'", que incluiu o rake versão 0.9.2.2. O trabalhador parou de travar com a nova versão.

Wes
fonte
0

Seu problema é causado por não excluir o Gemfile.lockarquivo e não é específico do Heroku. A exclusão Gemfile.lockdeve resolver o problema, mas o levará direto para outro:

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>'

Infelizmente, ainda não encontrei a solução para esse problema, já que diminuir o Rake para 0.8.7 não parece funcionar aqui. Se outra pessoa tiver uma resposta, eu agradeceria muito.

klaffenboeck
fonte
4
Eu nunca recomendaria deletar seu lockfile.
wuputah
2
Excluir o Gemfile.lock resultará na instalação de todas as versões mais recentes de todas as gemas em cada implantação no heroku (a menos que você fixe todas as versões no Gemfile).
Kliment Mamykin