2011-09-02 12 views
8

Me estoy familiarizando con Rails 3.1, y me quemé un tiempo actualizando un proyecto antiguo y tratando de averiguar cómo se comporta la nueva línea de activos en el modo de desarrollo en comparación con la producción.¿Cómo se detectan errores en la cartera de activos de rieles antes de la producción?

El valor predeterminado config.assets.precompile entorno bendice solamente application.css y application.js, con la intención de que todo debe ser servido como una sola hoja de estilo y un solo archivo javascript.

Es obvio que hay situaciones en las que no queremos que, por lo que podemos añadir elementos a la lista en esa variable config ...

Esta es la situación me encontré con mi proyecto de recinto de seguridad cuando se va a la producción:

  1. Navegué por el sitio en desarrollo, vi que todo estaba funcionando. Los activos se vincularon como archivos separados y el sitio se visualizó correctamente.
  2. Subí el sitio a mi servidor y traté de hacerlo funcionar en producción. El primer error fue decir que "ie.css" (una hoja de estilo condicional) no está precompilada. (Yo estaba en Safari y esta hoja de estilo ni siquiera se descargaría: el error se planteó desde el asistente stylesheet_link_tag antes de mostrar la página.)
  3. Ran rake assets:precompile e intenté de nuevo.
  4. Agregó el elemento ofensivo a config.assets.precompile y lo intenté de nuevo.
  5. Pateó el error por la acera hasta que tocó otro error de activo.
  6. GOTO 3.

Sin saber cómo hacer frente a esto, me dio la vuelta en círculos durante unos minutos hasta que pensé que me dieron todos los activos y el sitio estaba convirtiendo en la producción. Luego lo intenté en MSIE y presioné otro error 500: "belated_png_fix.js" que se estaba cargando de forma condicional, y no apareció hasta entonces.

Así que mi pregunta es, además del método de prueba y error o una gran dependencia de las pruebas de integración, cómo puedo predecir que mi sitio no va a explotar cuando la cartera de activos descubre que no se agregó ninguna hoja de estilo o javascript a la lista de precompilación?

También me llama la atención saber por qué un elemento de la hoja de estilos faltante debería ocasionar que la página entera tenga un error de 500 en lugar de simplemente compilarlo a pedido o servir un 404 cuando se solicita ese activo. ¿Es este un diseño deliberado para "fallar temprano"?

+0

Recientemente convertí una aplicación anterior a la cartera de activos y no tuve problemas. Sin embargo, me llevó un tiempo descubrir cómo funcionaban las cosas juntas. Para responder a su pregunta, ¿puede mostrar los contenidos de sus archivos css y js, específicamente las declaraciones requeridas? También me interesa cómo los está llamando desde la vista. Por último, ¿están todos en aplicación/activos o también estás usando lib/assets y vendor/assets? –

Respuesta

1

Tuve problemas similares con los carriles 3.1 también. Lo mejor que puedes hacer es instalar capistrano multi stage y obtener un servidor de almacenamiento intermedio.

Si por alguna razón esto no es posible, instale una máquina virtual en su computadora e intente replicar el entorno de su servidor.

+0

Sí, ya lo hago, esencialmente. Se incluye bajo el título de "prueba y error" (que sin duda podría automatizarse con algunas pruebas de integración ... tal vez no hay mejor manera). –

0

Esto puede ser exagerado, pero esto funciona para mí (me da activos compilados y limpios). Tengo esto en mi archivo .bash_profile.

alias ggo='bundle exec rake assets:clean && bundle exec rake assets:precompile && git add . && git commit -m "precompile" && git push origin master && cap deploy' 

y esto en mi config/environments/production.rb (producción de fuerzas para compilar cuando sea necesario; no debe ser una necesidad de si recuerdo para funcionar "ggo" primero):

config.assets.compile = true 

lo tanto, mi flujo de trabajo es: 1. Código 2. git add & git commit 3. si toqué archivos CSS/SASS/JS/CoffeeScript, ejecuto ggo. De lo contrario, hago un despliegue de límite normal.

+0

Truco útil, pero el problema es que la precompilación solo actúa sobre elementos que conoce acerca de. El truco está de alguna manera averiguar qué recursos se vincularon desde varios puntos de vista y garantizar que se agreguen a la lista. –

1

La implementación continua es una gran cosa, y debe llegar al punto en que es tan simple que realmente no es tan doloroso de todos modos. Dicho esto, config.assets.precompile puede tomar expresiones regulares, entonces, ¿qué tal si se llega a un estándar para los archivos "manifiestos" de piñones de nivel superior o una subcarpeta estándar para cosas que no se incluirán? (Tenga en cuenta que no he probado esto todavía ...)

2

Acabo de lanzar una gema llamada assets_precompile_enforcer, que garantiza que los desarrolladores no olviden agregar activos a config.assets.precompile mientras están en desarrollo. Se incluirá una excepción si incluye un activo a través de javascript_include_tag o stylesheet_link_tag, y no coincide con un filtro en config.assets.precompile.

Esto significa que los errores de los activos se detectarán durante el desarrollo, en lugar de descubrirse después de la implementación en la producción.

Cuestiones relacionadas