Comment résoudre le problème de constante non initialisée Rake :: DSL sur Heroku?

101

Je reçois des erreurs similaires à celles de ces questions , sauf que les miennes 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 préciser gem 'rake', '0.8.7'parce que la version 0.9 pose le problème.

Quand j'essaye d'ajouter gem 'rake', '0.8.7'à mon gemfile et pousser à 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 '[email protected]:my_app.git'

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

ben
la source
Avez-vous essayé la réponse n ° 3 que vous avez publiée? Que s'est-il passé après ces changements?
Zabba

Réponses:

205

Mettez ceci dans votre Rakefile ci-dessus, nécessite 'rake':

require 'rake/dsl_definition'
chou frisé
la source
3
Je vous remercie. Cela a réglé mes problèmes et je ne savais pas ce qui se passait. (Utilisation du programme d'installation des rails sur Windows et déploiement sur heroku, en tant que débutant complet.)
Jack V.
1
cette solution fonctionne-t-elle sous Windows parce que j'obtiens toujours la même erreur - constante non initialisée Rake :: DSL
David
2
J'ai eu l'erreur de déploiement sur Heroku, qui a généré aujourd'hui rake 0.9.2. Puisque le problème d'origine était avec la 0.9.0, peut-être que la version de rake n'est plus le problème. L'ajout de la requireligne au rakefile (et le réengagement et le repoussement vers github et Heroku) l'a résolu. @David, j'utilise Windows avec le framework RoR de RailInstaller 1.2.0.
Mark Berry
Eh bien, vous devrez mettre à jour vers rake 0.9.2 pour que cela fonctionne. Bonne chance!
RubyFanatic
J'obtiens cette erreur en faisant rake db: create, "aucun fichier de ce type à charger - rake / dsl_definition"
KMC
8

Chaque fois que vous modifiez votre Gemfile, vous devez mettre bundle installà jour votre lockfile (Gemfile.lock). L'erreur que vous obtenez lors du 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 cours de développement, mais vous n'avez pas vérifié le snapshot résultant (Gemfile.lock) dans le contrôle de version

wuputah
la source
1
Vous devrez peut-être exécuter "bundle update rake" pour régénérer Gemfile.lock.
Jan Hettich
6

J'ai résolu ça, finalement, après beaucoup de bavardages. La version courte de ce que j'ai fait, en ratant les nombreuses expériences, était la suivante:

1) changez le Gemfile pour spécifier Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Supprimez un hack que j'avais précédemment ajouté à Rakefile basé sur la question Stack Overflow Ruby on Rails et les problèmes de Rake: constante non initialisée Rake :: DSL :

Ainsi, 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) Changez Heroku pour exécuter mon application dans Ruby 1.9.2:

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

Et cela semble bien maintenant - la tâche cron planifiée est en cours d'exécution de toute façon.

EDIT: Il a bien fonctionné, une fois, puis a explosé à nouveau la prochaine fois que j'ai poussé quelque chose! Arrgh. Je pense que je l'ai corrigé maintenant, avec l'ajout de la delayed_jobgemme, en fonction de la conversation Je ne sais pas comment créer des tâches: travailler .

L'installation delayed_jobne semble pas être une excellente solution, mais cela a fonctionné, et je pourrais vouloir l'utiliser parfois, je suppose, en particulier avec le travail cron de Heroku une fois par heure (qui n'est tout simplement pas assez fréquent - il y a des choses que je '' Je veux probablement courir toutes les cinq minutes). Après avoir installé la delayed_jobgemme, j'ai dû faire la configuration pour cela, sinon Heroku se plaint de la delayed_jobstable manquante :

#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
la source
1

J'avais une application Rails 3.0.11, qui spécifiait la version 0.8.7 de rake dans le Gemfile pour contourner le problème de la version 0.9.2 Rake :: DSL.

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

Nous s
la source
0

Votre problème est causé par la non suppression du Gemfile.lockfichier et n'est pas spécifique à Heroku. La suppression Gemfile.lockdevrait 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, car la rétrogradation de Rake à 0.8.7 ne semble pas fonctionner ici. Si quelqu'un d'autre a une réponse, je l'apprécierais beaucoup.

Klaffenboeck
la source
4
Je ne recommanderais jamais de supprimer votre fichier de verrouillage.
wuputah
2
La suppression de votre Gemfile.lock entraînera l'installation de toutes les dernières versions de tous les gemmes à chaque déploiement sur heroku (sauf si vous épinglez toutes les versions dans Gemfile).
Kliment Mamykin