101 votes

Comment corriger le problème des constantes non initialisées de Rake::DSL sur Heroku ?

Je reçois des erreurs similaires à celles sur ces questions sauf que les miens se produisent sur 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>'

La réponse à ces questions semble être de spécifier gem 'rake', '0.8.7' parce que la version 0.9 cause le problème.

Lorsque j'essaie d'ajouter gem 'rake', '0.8.7' à mon gemfile et pousser vers Heroku j'obtiens cette erreur :

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'

Mon gemfile fonctionne normalement bien sur Heroku. Que dois-je faire ?

205voto

Kale Points 2074

Mettez ceci dans votre Rakefile au-dessus de nécessite 'rake' :

require 'rake/dsl_definition'

8voto

wuputah Points 8189

Chaque fois que vous modifiez votre Gemfile, vous devez bundle install pour mettre à jour votre fichier de verrouillage (Gemfile.lock). L'erreur que vous obtenez sur push n'est pas spécifique au changement de version de rake.

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

Notez le message d'erreur que vous avez reçu :

Vous avez modifié votre Gemfile en développement mais n'avez pas enregistré le snapshot résultant (Gemfile.lock) dans le contrôle de version.

6voto

Max Williams Points 10129

J'ai finalement résolu ce problème, après beaucoup d'efforts. La version courte de ce que j'ai fait, en omettant les nombreuses expériences, est la suivante :

1) changer le Gemfile pour spécifier Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Enlever un hack que j'avais précédemment ajouté à Rakefile basé sur une question de Stack Overflow. Problèmes avec Ruby on Rails et Rake : constante non initialisée Rake::DSL :

Donc, mon Rakefile est maintenant redevenu le Rakefile standard pour mon application :

# 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) Changer Heroku pour exécuter mon application en Ruby 1.9.2 :

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

Et tout semble bien se passer maintenant - la tâche cron programmée s'exécute de toute façon.

EDIT : Il a fait a bien fonctionné, une fois, puis a explosé à nouveau la fois suivante où j'ai poussé quelque chose ! Arrgh. Je pense que je l'ai réparé maintenant, avec l'ajout de l'élément delayed_job gem, basé sur la conversation _Je ne sais pas comment créer des tâches : travail_ .

Installation de delayed_job ne semble pas être une solution idéale, mais elle a fonctionné, et je pourrais avoir envie de l'utiliser un jour ou l'autre, surtout avec la tâche cron de Heroku qui n'est exécutée qu'une fois par heure (ce qui n'est pas assez fréquent - il y a des choses que je voudrais probablement exécuter toutes les cinq minutes). Après avoir installé le delayed_job j'ai dû faire la configuration pour cela, sinon Heroku se plaint de l'absence de delayed_jobs table :

#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

1voto

Wes Points 11

J'avais une application Rails 3.0.11, qui spécifiait rake version 0.

Après avoir converti l'application en Rails 3.2.0 (pile Heroku Cedar), j'ai eu un problème avec le worker (une tâche rake) qui se plantait. J'ai changé "gem 'rake', '0.8.7'" en "gem 'rake'", qui a fourni la version 0.9.2.2 de rake. Le travailleur a cessé de se bloquer avec la nouvelle version.

0voto

klaffenboeck Points 1910

Votre problème est dû au fait que vous n'avez pas supprimé le fichier Gemfile.lock et n'est pas spécifique à Heroku. Suppression de Gemfile.lock devrait résoudre ce problème, mais vous mènera directement à un autre :

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

Malheureusement, je n'ai pas encore trouvé la solution à ce problème, puisque la mise à niveau de Rake vers 0.8.7 ne semble pas fonctionner ici. Si quelqu'un d'autre a une réponse, je l'apprécierais beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X