2011-09-24 9 views
25

El comando "rake assets: precompile" funciona muy lento para mí. Especialmente en mi servidor de producción Amazon EC2 Micro que no tiene muchos recursos de procesador. En EC2 tengo que esperar 1 minuto o más durante cada implementación solo para esta tarea de precompilación. ¿Hay alguna manera de hacerlo más rápido?activos de rake: la precompilación es lenta

Anteriormente utilicé Jammit para comprimir/minify css y js. Jammit trabajó casi 10 veces más rápido en el mismo sitio web y servidores.

+2

puede precompilar sus activos antes de implementar –

+1

Correcto, pensé en eso. Pero no sé cómo implementaré los activos precompilados para producción fácilmente. Estoy usando capistrano y cada vez se comprometerán los activos precompilados a git. Mi preocupación es que el repositorio de git crecerá rápidamente en este caso, manteniendo el historial de todos los activos anteriores. Y eso no es solo css/js, sino también todas las imágenes de los activos. – Evgenii

+2

También es extremadamente lento para mí (135,987ms = ~ 2 minutos). Tendré que buscar precompilación antes de implementar ... Me preocupa agregarlos a git también, sobre todo porque eso agregaría mucho ruido a los registros de git. Yo recomendaría no agregarlos a git, simplemente rsync ese directorio de localhost a su servidor web como parte de su script de despliegue de tapa. –

Respuesta

30

Si no es necesario cargar el entorno de Rails, debe desactivar con que:

config.assets.initialize_on_precompile = false 

EDIT: Acabo de escribir una joya para resolver este problema, llamado turbo-sprockets-rails3. Acelera su assets:precompile compilando solo los archivos cambiados, y solo compilando una vez para generar todos los activos.

Sería increíble si pudiera ayudarme a probar la gema turbo-sprockets-rails3, y avíseme si tiene algún problema.

+3

Tu joya es increíble.Resolvió mi problema con d3 y precompilación. Gracias hombre – chaostheory

10

Hay un bug in Rails 3.1.0 que incluye demasiados archivos en el proceso de precompilación. Esta podría ser la razón de la lentitud si tiene muchos activos js y css activos.

La otra es que Sprockets (la gema que hace la compilación) es más compleja y tiene que permitir más opciones: scss, coffeescript y erb. Debido a esto, sospecho que será más lento haciendo solo concatenación y minificación.

Como se sugirió, puede precompilar los archivos antes de implementarlos si esto todavía es un problema.

+0

Gracias por la explicación. También creo que es lento porque necesita cargar el entorno de los rieles en la producción, que no fue el caso de Jammit. En cualquier caso, no voy a volver a Jammit. Me gusta mucho la cartera de activos. – Evgenii

1

Mi solución es excluir application.js .css y cualquier otro activo relacionado con la aplicación desde la precompilación. De modo que puedo usar rake assets:precompile una vez para precompilar activos relacionados con el motor solamente.

Luego, en cada despliegue yo uso una tarea rake sencillo de construir los activos relacionados con la aplicación y fusionarlas en manifest.yml:

namespace :assets do 
    task :precompile_application_only => :environment do 
    require 'sprockets' 

    # workaround used also by native assets:precompile:all to load sprockets hooks 
    _ = ActionView::Base 

    # ============================================== 
    # = Read configuration from Rails/assets.yml = 
    # ============================================== 

    env   = Rails.application.assets 
    target  = File.join(::Rails.public_path, Rails.application.config.assets.prefix) 
    assets  = YAML.load_file(Rails.root.join('config', 'assets.yml')) 
    manifest_path = Rails.root.join(target, 'manifest.yml') 
    digest  = !!Rails.application.config.assets.digest 
    manifest  = digest 


    # ======================= 
    # = Old manifest backup = 
    # ======================= 

    manifest_old = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {} 

    # ================== 
    # = Compile assets = 
    # ================== 

    compiler = Sprockets::StaticCompiler.new(env, 
              target, 
              assets, 
              :digest => digest, 
              :manifest => manifest) 
    compiler.compile 

    # =================================== 
    # = Merge new manifest into old one = 
    # =================================== 

    manifest_new = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {} 

    File.open(manifest_path, 'w') do |out| 
     YAML.dump(manifest_old.merge(manifest_new), out) 
    end 

    end 
end 

para especificar qué activos para compilar i utilizar un archivo de configuración YAML (config/assets.yml):

por ej.

--- 
- site/site.css 
- admin/admin.css 
- site/site.js 
- admin/admin.js 
Cuestiones relacionadas