2011-12-17 7 views
8

rake --las tareas tardan unos 18 segundos en ejecutarse. Esto es sólo el tiempo que tarda en cargar todas las tareas, como resultado de cualquier tarea defino tomará por lo menos esta cantidad de tiempo para ejecutar:¿Cómo puedo acelerar la tarea de Ruby/Rake?

$time rake --tasks 
rake db:clean   # Cleaning up database 
rake passenger:restart # Restart Application 
rake spec    # Run specs 

real 0m18.816s 
user 0m7.306s 
sys 0m5.665s 

Mi Rakefile:

$: << "." 
require "rubygems" 
require "rspec/core/rake_task" 

desc "Run those specs" 
task :spec do 
    RSpec::Core::RakeTask.new(:spec) do |t| 
    t.rspec_opts = %w{--colour --format progress} 
    t.pattern = 'spec/*_spec.rb' 
    end 
end 

task :default => :spec 

Cualquier idea ¿Por qué rastrillar lleva a muchas veces? Gracias

+0

¿Sucede con un Rakefile vacío también? ¿Puedes mostrar el tuyo? –

+0

Mi rakefile solo contiene la tarea rpec como se puede ver en mi publicación – Laughingman

+0

¿Estás seguro de que tienes el Rakefile correcto? 'rake -T' muestra una tarea de reinicio del pasajero que no está definida (ni incluida) en su Rakefile. –

Respuesta

0

todo el entorno de los carriles tiene que ser cargado, por lo tanto, incluso las tareas más simples, tales como rastrillo rake --tasks tomar un tiempo. Abrir una consola con rails console o script/console lleva un tiempo similar. Puede intentar hackear Ruby o Rails to speed up rake, pero una optimización excesiva puede ser mala si desea cambiar a una versión más reciente más adelante. Dado que el entorno de los rieles debe estar cargado, cleaning up routes también puede ayudar.

4

Trate spring

línea de comandos se verá así:

spring rake -T 

Se necesitará más tiempo de funcionamiento de la primera vez, pero las ejecuciones posteriores será muy rápido.

3

Esta solución funcionó para mí: Faster rake tasks in Rails.

Tuve que hacer una pequeña variación cuando creé un directorio lib/tasks/no_rails y puse todos los archivos Rake que no necesitan Rieles allí y cargué solo aquellos que usan el método anterior.

1

Me gusta la solución Pratik menciona el caso general de los carriles de carga para las tareas que lo necesitan y no para los que no lo necesitan, para cualquier tarea de rastrillar sin tener que recordarlo previamente.

Un método menos invasivo para ejecutar una tarea de rake que no necesita raíles es usar la opción de rake -f para indicarle a rake que use un Rakefile en particular. De esta forma, Rake no buscará tareas de rake en todos los rieles.

Por ejemplo, asumiendo que su tarea anterior es en un archivo llamado Rakefile en el nivel superior de su proyecto y su Rakefile no hace nada que carga Rieles como require File.expand_path('../config/application', __FILE__), puede hacerlo:

$ rake -f Rakefile spec 

y debería ejecutar su tarea de especificación mucho más rápido. Pruebe $ time rake -f Rakefile -T; Hice esto con un Rakefile carriles-independiente de la mía y tengo:

real 0m1.543s 
user 0m1.308s 
sys  0m0.201s 

La desventaja es que hay que recordar para especificar esta opción cada vez, y no para especificar si desea ejecutar una tarea rastrillo de rieles como rake db:migrate.

Cuestiones relacionadas