2011-11-04 29 views
28

En Rails 3.1, debe incluir en la lista blanca los archivos que desee incluir en la precompilación de activos. Debe abrirse config/ambientes/production.rb e incluir explícitamente los activos que desea precompilado:¿Cuál es el propósito de config.assets.precompile?

config.assets.precompile += ['somestylesheet.css']

Si no lo hace esto y se ejecuta activos rastrillo: precompilación, su activo no lo hará se copiará en public/assets, y su aplicación generará una excepción (por lo tanto, producirá un error de 500 en la producción) cuando no se encuentre un activo.

¿Por qué es esto necesario? ¿Por qué no están todos los activos precompilados automáticamente?

Este enfoque actual crea un código adicional y estrés cuando se implementa. ¿No sería más fácil incluir o excluir activos de modo que todo salga bien? ¿Alguien más comparte estos sentimientos?

+1

Solo para aclarar, esto es más una crítica a la necesidad de ** especificar ** un activo. El proceso de precompilación de rieles no solo compila código, sino que también copia el código de recurso compilado en un directorio público para su servidor web. Incluso si un activo no requiere compilación (como un archivo '.js' simple), aún necesita decirle a su aplicación que lo" precompile ", para que se copie en' public/assets '. Si no lo hace, la página que requiere el activo arroja una excepción. – dhulihan

+1

Si está en la práctica de combinar y minificar archivos, probablemente no quiera precompilar todos sus recursos. Esta técnica es para activos que planea incluir individualmente. Por ejemplo, en application.js, puede '// 'requerir' muchos otros archivos JS que no necesitan ser precompilados. –

+0

@Simon Peck: tiene razón, algunos activos no necesitan ser precompilados, pero si no están incluidos explícitamente, no se copiarán en la ubicación del activo final (por ejemplo: 'public/assets'), y no se encontrará cuando se solicite. Agregar el activo a 'application.js' utilizando' // = require' funciona, pero agrega una sobrecarga de ancho de banda y no es apropiado para activos que no se usarán en todo el sitio. – dhulihan

Respuesta

2

Los activos precompilados para mí son geniales, por lo que no terminas desplegando activos que no deseas. Tampoco te olvides de la gema uglifer que ayuda a comprimir tus javascripts. Imagine todo esto no existe y acaba de implementar su aplicación y descubre que tiene archivos css sin usar y javascripts sin comprimir. Cómo te sentirías. esto es solo mi propia opinión y digo que la cartera de activos es lo más genial en los rieles. Ser capaz de administrar todos sus activos correctamente.

Y cuenta que si estoy carriles no me gustaría para compilar los activos que usted no querría por lo que diría en su mente, ¿por qué este tipo compilar estos activos .. :)

+0

Buen punto, gracias por los comentarios. Si un activo no se está utilizando en absoluto en la aplicación, no debe formar parte de la estructura de su archivo. A menos que el activo no deseado sea parte de una gema de un tercero que tenga otra funcionalidad deseable que no sea de activos. – dhulihan

+4

Preferiría tener activos no utilizados que los usuarios que ven las páginas 500 porque algo no se compiló explícitamente. – Gunchars

19

mayoría de los activos son incluido automáticamente en la precompilación de activos. De acuerdo con la RoR Guide on the Asset Pipeline:

El matcher por defecto para la compilación de archivos incluye application.js, application.css y todos los archivos que no terminan en js o css: [ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

que usaría si config.assets.precompile tiene activos adicionales para incluir:

config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

O podría sobrescribirlo.

+1

La palabra clave aquí es * la mayoría *. Aún debe agregar de forma explícita esos recursos arbitrarios adicionales, como 'admin.js', a la configuración de su aplicación, o algunas páginas pueden generar excepciones. Estoy debatiendo que este paso adicional puede no ser necesario. – dhulihan

8

Creo que tiene que ver con la capacidad de pipeline/sprockets para requerir archivos separados.

Por ejemplo, tengo un archivo admin.js en mi carpeta app/assets/javascripts. Pero todo lo que hace es requerir varios otros archivos .js.

//= require jquery 
//= require jquery_ujs 
//= require jquery.colorpicker.js 
//= require jquery.wysiwyg.js 
//= require wysiwyg.image.js 
//= require jquery.fileupload.js 
//= require jquery.fileupload-ui.js 
//= require codemirror.js 
//= require css.js 
//= require admin_load 

Esto se debe a que (a) estoy usando js externos plugins y (b) Me gustaría mantener las cosas como jQuery manipuladores onload en archivos separados.

Si cada archivo Js se ha precompilado, entonces sería precompilar cada uno de estos archivos individuales -que es totalmente innecesario. Todo lo que quiero/necesito es el único archivo admin.js precompilado.

Lo mismo ocurre con los archivos CSS.

+4

Es cierto que hay algunos recursos que no requieren ningún tipo de compilación (como archivos '.js' sin formato) y no deberían compilarse, como usted dijo. Sin embargo, si está utilizando este activo en algún lugar que no sea un manifiesto de piñón (por ejemplo, usando 'javascript_include_tag 'admin.js'' en una vista), y no incluyó explícitamente este activo arbitrario en la configuración de su aplicación, nunca lo hará copiarse a 'public/assets' y la página generará una excepción en la producción. – dhulihan

Cuestiones relacionadas