2012-01-21 8 views
6

Acabo de empezar con Rails, así que disculpe mi pregunta bastante básica. Ya me estoy dando cuenta de que el comando rake routes tarda un tiempo en ejecutarse cada vez que lo ejecuto. Tengo alrededor de 20 rutas para 3 controladores y toma aproximadamente 40 segundos para ejecutar.¿Cuánto tiempo deben transcurrir las "rutas de rastrillo"?

¿Eso es normal? ¿Cómo podría acelerar esto?

P.S .: Estoy en Windows 7 con rieles 3.1.3 (creados con rieles de instalación).

ambiente
+1

se trata sólo de rastrillo rutas que toma un tiempo? ¿Es lento iniciar tu servidor o la consola también? –

+0

mejor u puede comprobar las rutas para el controlador controller = controllername rutas rastrillo particulares –

+0

@Jan: servidor (aproximadamente 1:15 min) y la consola (doce y cuarenta y cinco minutos) también tomar un tiempo –

Respuesta

2

La tarea rutas rastrillo depende de la tarea ambiente que carga el entorno de Rails y requiere miles de archivos de Ruby.

El tiempo de inicio de un entorno de Rails y el correspondiente tiempo de ejecución rutas rastrillo están muy cerca (en mi Linux en-esteroides-portátil con una aplicación Rails con ~ 50 rutas):

$ time ruby -r./config/environment.rb -e '' 

real 0m5.065s 
user 0m4.552s 
sys 0m0.456s 

$ time rake routes 

real 0m4.955s 
user 0m4.580s 
sys 0m0.344s 

No hay Una manera fácil de disminuir el tiempo de inicio, ya que depende de la forma en que su intérprete necesita archivos de script: http://rhnh.net/2011/05/28/speeding-up-rails-startup-time

+0

Mis medidas son muy altas para la parte "real" . Estoy muy seguro de que se puede disminuir. Mis colegas que trabajan con la misma aplicación en Ubuntu obtienen resultados casi inmediatos al invocar rieles o rake. real \t 0m26.287s usuario \t 0m3.668s sys \t 0m1.672s – Steven

-1

Rails tiene una enorme cantidad de más tiempo para ser cargados en Windows. Te recomiendo que pruebes Unix, como Ubuntu, ya que Windows es el peor entorno en el que puedes ejecutar y desarrollar aplicaciones de Ruby on Rails. Pero si solo está probando Rails, Windows es suficiente :)

+0

Está destinado a ejecutar 'rutas de rastreo 'o no estaría disponible como una tarea de Rake. Si el OP acaba de comenzar con Rails, la tarea de rutas les será útil para comprender las rutas que se configuran automáticamente. –

+0

Corro rutas de rastreo todo el tiempo porque me resulta más fácil averiguar a qué se traduce una ruta. –

+0

la tarea de rutas de rastreo es muy útil cuando se comienza con Rails. No soy un principiante, pero a menudo uso esa tarea, en realidad cada vez que necesito revisar I18n traducciones de rutas. – Jef

0

Parece un poco largo, pero ¿realmente necesita ejecutar rake routes tan a menudo? En mi sistema, OSX Lion/Rails 3.2.0, rake routes toma ~ 10s.

+0

Al menos al principio, mientras trato de entender el concepto, tengo la sensación de que tendré que hacerlo ;-) –

1

Se me ocurrió una solución a rake routes, tardando unos 8 segundos en ejecutarse cada vez. Es un simple caché basado en archivos que ejecuta bundle exec rake routes, almacena el resultado en un archivo bajo tmp. El nombre de archivo es el hash md5 de config/routes.rb, por lo que si realiza un cambio y lo vuelve a cambiar, usará el archivo antiguo en caché.

puse las siguientes funciones de bash en un archivo ejecutable que llamo fastroutes:

if [ ! -f config/routes.rb ]; then 
    echo "Not in root of rails app" 
    exit 1 
fi 

cached_routes_filename="tmp/cached_routes_$(md5 -q config/routes.rb).txt" 

function cache_routes { 
    bundle exec rake routes > $cached_routes_filename 
} 

function clear_cache { 
    for old_file in $(ls tmp/cache_routes*.txt); do 
    rm $old_file 
    done 
} 

function show_cache { 
    cat $cached_routes_filename 
} 

function show_current_filename { 
    echo $cached_routes_filename 
} 

function main { 
    if [ ! -f $cached_routes_filename ]; then 
    cache_routes 
    fi 

    show_cache 
} 

if [[ "$1" == "-f" ]] 
then 
    show_current_filename 
elif [[ "$1" == "-r" ]] 
then 
    rm $cached_routes_filename 
    cache_routes 
else 
    main 
fi 

Aquí hay una github link también.

De esta manera, es suficiente para generar las rutas una vez, y luego fastroutes se utilizan los valores almacenados en caché.

0

En su Rakefile:

#Ouptut stored output of rake routes 
task :fast_routes => 'tmp/routes_output' do |t| 
    sh 'cat', t.source 
end 

#Update tmp/routes_output if its older than 'config/routes.rb' 
file 'tmp/routes_output' => 'config/routes.rb' do |t| 
    outputf = File.open(t.name, 'w') 
    begin 
    $stdout = outputf 
    Rake.application['routes'].invoke 
    ensure 
    outputf.close 
    $stdout = STDOUT 
    end 
end 
Cuestiones relacionadas