Comment réparer le problème Rake :: DSL constant non initialisé sur Heroku?

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

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

Lorsque j’essaie d’append gem 'rake', '0.8.7' à mon fichier gemf et de le pousser sur 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 très bien sur Heroku. Que devrais-je faire?

Mettez ceci dans votre fichier de rake ci-dessus nécessite ‘rake’:

 require 'rake/dsl_definition' 

Chaque fois que vous modifiez votre Gemfile, vous devez bundle install pour mettre à jour votre fichier de locking (Gemfile.lock). L’erreur que vous obtenez sur push n’est pas spécifique à la modification de la 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 vérifié le snapshot résultant (Gemfile.lock) dans le contrôle de version

J’ai finalement résolu ce problème après avoir beaucoup réfléchi. La version courte de ce que j’ai fait, manquant les nombreuses expériences, était la suivante:

1) changer 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 en fonction de la question de débordement de la stack Ruby on Rails et des problèmes Rake: constante Rake :: DSL non initialisée :

Donc, mon fichier Rakefile redevient le fichier 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 dans Ruby 1.9.2:

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

Et il semble bien maintenant – la tâche périodique planifiée est en cours d’exécution de toute façon.

EDIT: Il a bien fonctionné, une fois, puis a explosé la prochaine fois que j’ai poussé quelque chose! Arrgh. Je pense que je l’ai corrigé maintenant, avec l’ajout du bijou de delayed_job , basé sur la conversation. Je ne sais pas comment créer des jobs de tâches: travailler .

L’installation de delayed_job ne semble pas être une excellente solution, mais elle a fonctionné, et je delayed_job peut-être l’utiliser un jour, surtout avec le job cron d’Heroku par heure (ce qui n’est pas assez fréquent – il y a des choses que je vous voudrez probablement courir toutes les cinq minutes). Après avoir installé le joyau de delayed_job je devais faire la configuration pour cela, sinon Heroku se plaint de la table delayed_jobs 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 

J’avais une application Rails 3.0.11, qui spécifiait la version 0.8.7 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 (stack de cèdres Heroku), j’avais un problème avec le plantage du travailleur (une tâche de râteau). J’ai changé “gem ‘rake’, ‘0.8.7’” pour “gem ‘rake'”, qui regroupait la version de rake 0.9.2.2. Le travailleur a cessé de planter avec la nouvelle version.

Votre problème est dû à la non suppression du fichier Gemfile.lock et n’est pas spécifique à Heroku. La 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 `' /app/Rakefile:12:in `' /app/Rakefile:11:in `' /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 `
'

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.