Diferencia entre assetic: dump y assets: install

81

En Symfony2, ¿cuál es la diferencia entre assetic:dumpy assets:install? ¿En qué escenarios debería usarse cada uno de estos comandos y en qué orden (si el orden es relevante)?

Richard Keller
fuente

Respuestas:

137

De hecho, escribí sobre esto recientemente en un artículo sobre OroCRM, que está basado en Symfony 2. Si quieres algo del contexto / por qué de los diferentes comandos, puede que te resulte interesante.

Hay dos sistemas diferentes para incluir archivos frontend (javascript, css, imágenes, etc.) en una aplicación Symfony. El assets:installcomando vino primero. Este comando buscará todos los paquetes de Symfony en una aplicación para

Resources/public

carpeta. Si lo encuentra, el assets:installcomando copiará o vinculará archivos de Resources/publica web/public/bundle/[bundle-name]. Aquí es donde los enlaces creados con la assetsfunción twig buscarán estos archivos. Esta

<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>

Se convierte en esto

<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>

Eso es todo lo assetsque hace el sistema. Le permite almacenar sus archivos frontend con el paquete.

El asseticsistema es diferente. Con assetic, enlaza a archivos como este.

{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

Hay etiquetas similares para hojas de estilo e imágenes. Tenga en cuenta que le asseticpermite vincular archivos en cualquier paquete. ( @AcmeFooBundle). Assetic también le permitirá vincular a varios archivos en una carpeta con un comodín.

{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

Otra diferencia con asseticestá en los enlaces generados. En el devmedio ambiente se verán así.

<script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
<script type="text/javascript" src="/app_dev.php/js/bar.js"></script>

Es decir, las solicitudes de estos archivos se ejecutarán a través del controlador frontal de PHP ( app_dev.php) a través de la configuración de rutas especiales en el asseticpaquete. Esto significa que, cuando está en devmodo, nunca tendrá que deshacerse de sus activos. Se incluyen automáticamente. También le permite aplicar filtros a los archivos. Por ejemplo, lo siguiente aplica el cssrewritefiltro a los archivos extraídos.

{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Si alguna vez quisiste alterar programáticamente la salida de tus activos frontend,  asseticte permite hacerlo escribiendo filtros twig personalizados.

Sin embargo, esto requiere un alto rendimiento. En producción, en lugar de vincular cada archivo individualmente a través de un archivo de controlador frontal PHP, el HTML generado se verá así

<script type="text/javascript" src="/js/as5s31l.js"></script>

De donde as5s31l.jsviene Eso es lo que hace el assetic:dumpcomando. Se combina todos los archivos javascript / css individuales (después de aplicar los filtros) y crea un bonito, estático, el archivo puede almacenar en caché para la producción.

Qué necesitas hacer

A menos que el proyecto le indique específicamente lo contrario, siempre debe ejecutar assets:instally assetic:dump, porque nunca sabrá cuáles de sus paquetes de terceros utilizan estos comandos. Solo necesita ejecutar assetic:dumpantes de implementar o ver la aplicación en prodmodo. El orden es irrelevante.

En cuanto a qué sistema debe usar su paquete, si ha leído lo anterior y no está seguro de lo que asseticpuede hacer por usted, use assets. Estarás bien.

Alan Storm
fuente
11
Esta es una respuesta fantástica, gracias. No creo que la distinción se haga en ninguna parte de los documentos de Symfony, y tu respuesta aclara las cosas.
Richard Keller
Gracias por aclarar esto. ¿Dónde dijiste <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> que realmente querías decir <script type="text/javascript" src="app.php/js/as5s31l.js"></script>
Sam Anthony
@Sam Probablemente, aunque podría haber querido decir "/js/as5s31l.js", no recuerdo lo que genera Symfony y no tengo un proyecto activo disponible para probar.
Alan Storm
Gracias también por esta respuesta. Si los archivos se sirven de forma individual a través del controlador frontal dev, ¿significa esto que no se puede establecer un filtro sass para procesar archivos scss en dev env?
Stphane
@Stphane No estoy familiarizado con la cadena de herramientas de interfaz específica de la que está hablando, pero la idea detrás de este sistema es que assetic podría modificarse o extenderse para incluir el procesamiento SCSS.
Alan Storm