¿Cómo solucionar el problema de Rake :: DSL constante no inicializado en Heroku?

101

Recibo errores similares a los de estas preguntas , excepto que los míos están ocurriendo en 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 respuesta en esas preguntas parece ser específica gem 'rake', '0.8.7'porque la versión 0.9 causa el problema.

Cuando intento agregar gem 'rake', '0.8.7'a mi archivo de gemas y presionar a Heroku, aparece este error:

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'

Mi archivo de gemas normalmente funciona bien en Heroku. ¿Qué tengo que hacer?

ben
fuente
¿Probaste la respuesta n. ° 3 que publicaste? ¿Qué pasó después de hacer esos cambios?
Zabba

Respuestas:

205

Pon esto en tu Rakefile anterior require 'rake':

require 'rake/dsl_definition'
col rizada
fuente
3
Gracias. Eso solucionó mis problemas y no sabía qué estaba pasando. (Usando el instalador de rieles en Windows y desplegándolo en heroku, como un principiante completo).
Jack V.
1
¿Esta solución funciona en Windows porque sigo recibiendo el mismo error? Rake constante no inicializado :: DSL
David
2
Recibí el error al implementar Heroku, que hoy generó rake 0.9.2. Dado que el problema original era 0.9.0, tal vez la versión de rake ya no sea el problema. Agregar la requirelínea al archivo rake (y volver a comprometer y volver a presionar a github y Heroku) lo resolvió. @David, estoy usando Windows con el marco RoR de RailInstaller 1.2.0.
Mark Berry
Bueno, necesitarás actualizar a rake 0.9.2 para que esto funcione. ¡Buena suerte!
RubyFanatic
Recibo este error al hacer rake db: create, "no hay tal archivo para cargar - rake / dsl_definition"
KMC
8

Cada vez que cambie su archivo Gemfile, debe bundle installactualizar su archivo de bloqueo (Gemfile.lock). El error que está obteniendo en push no es específico para cambiar la versión de rake.

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

Tenga en cuenta el mensaje de error que recibió:

Modificó su Gemfile en desarrollo, pero no verificó la instantánea resultante (Gemfile.lock) en el control de versiones.

wuputah
fuente
1
Es posible que deba ejecutar "bundle update rake" para regenerar Gemfile.lock.
Jan Hettich
6

Resolví esto, finalmente, después de un montón de tonterías. La versión corta de lo que hice, perdiéndome muchos experimentos, fue esta:

1) cambie el Gemfile para especificar Rake 0.8.7

#in Gemfile
gem "rake", "0.8.7"

2) Elimine un truco que había agregado previamente a Rakefile basado en la pregunta de Stack Overflow Ruby on Rails y problemas de Rake: Rake constante no inicializada :: DSL :

Entonces, mi Rakefile ahora ha vuelto a ser el Rakefile estándar para mi aplicación:

# 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) Cambiar Heroku para ejecutar mi aplicación en Ruby 1.9.2:

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

Y parece estar bien ahora: la tarea cron programada se está ejecutando de todos modos.

EDIT: se ejecuta bien, una vez, luego explotó de nuevo la próxima vez que empujaba algo! Arrgh. Creo que lo arreglé ahora, con la adición de la delayed_jobgema, basado en la conversación No sé cómo construir trabajos de tarea: trabajo .

La instalación delayed_jobno parece una gran solución, pero ha funcionado, y creo que podría querer usarla en algún momento, especialmente con el trabajo cron de una vez por hora de Heroku (que simplemente no es lo suficientemente frecuente, hay cosas que ' probablemente querrá correr cada cinco minutos). Después de instalar la delayed_jobgema, tuve que configurarla; de lo contrario, Heroku se queja de la delayed_jobstabla que falta :

#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
fuente
1

Tenía una aplicación Rails 3.0.11, que especificaba la versión 0.8.7 de rake en Gemfile para solucionar el problema Rake :: DSL de la versión 0.9.2.

Después de convertir la aplicación a Rails 3.2.0 (pila Heroku Cedar), estaba teniendo un problema con el trabajador (una tarea de rastrillo) que fallaba. Cambié "gem 'rake', '0.8.7'" por "gem 'rake'", que incluía la versión 0.9.2.2 del rake. El trabajador dejó de fallar con la nueva versión.

Wes
fuente
0

Su problema se debe a que no eliminó el Gemfile.lockarchivo y no es específico de Heroku. La eliminación Gemfile.lockdebería solucionar este problema, pero lo llevará directamente a otro:

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

Desafortunadamente, todavía no he encontrado la solución para ese problema, ya que la degradación de Rake a 0.8.7 no parece funcionar aquí. Si alguien más tiene una respuesta, se lo agradecería mucho.

Klaffenboeck
fuente
4
Nunca recomendaría eliminar su archivo de bloqueo.
wuputah
2
Eliminar su Gemfile.lock resultará en la instalación de todas las versiones más recientes de todas las gemas en cada implementación en heroku (a menos que ancle todas las versiones en Gemfile).
Kliment Mamykin