Unterschied zwischen Assetic: Dump und Assets: Install

81

Was ist in Symfony2 der Unterschied zwischen assetic:dumpund assets:install? In welchen Szenarien sollte jeder dieser Befehle verwendet werden und in welcher Reihenfolge (wenn die Reihenfolge relevant ist)?

Richard Keller
quelle

Antworten:

137

Ich habe darüber kürzlich in einem Artikel über OroCRM geschrieben, der auf Symfony 2 basiert. Wenn Sie etwas über den Kontext / das Warum der verschiedenen Befehle erfahren möchten, finden Sie ihn möglicherweise interessant.

Es gibt zwei verschiedene Systeme zum Einfügen von Frontend-Dateien (Javascript, CSS, Bilder usw.) in eine Symfony-Anwendung. Der assets:installBefehl kam zuerst. Dieser Befehl durchsucht alle Symfony-Bundles in einer Anwendung nach a

Resources/public

Ordner. Wenn gefunden, assets:installkopiert oder verknüpft der Befehl Dateien von Resources/publicnach web/public/bundle/[bundle-name]. Hier assetssuchen Links, die mit der Zweigfunktion erstellt wurden , nach diesen Dateien. Dies

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

Wird dies

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

Das ist alles, was das assetsSystem tut. Sie können Ihre Frontend-Dateien mit dem Bundle speichern.

Das asseticSystem ist anders. Mit asseticverlinken Sie auf solche Dateien.

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

Es gibt ähnliche Tags für Stylesheets und Bilder. Beachten Sie, asseticdass Sie mit Dateien in einem beliebigen Bundle verknüpfen können . ( @AcmeFooBundle). Mit Assetic können Sie auch mit einem Platzhalter auf mehrere Dateien in einem Ordner verlinken.

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

Ein weiterer Unterschied asseticbesteht in den generierten Links. In der devUmgebung sehen sie ungefähr so ​​aus.

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

Das heißt, Anforderungen für diese Dateien werden app_dev.phpüber spezielle Routen, die im asseticBundle eingerichtet sind, über den PHP-Frontcontroller ( ) ausgeführt . Dies bedeutet, dass Sie im devModus niemals Ihre Assets sichern müssen. Sie werden automatisch aufgenommen. Außerdem können Sie Filter auf die Dateien anwenden. Im Folgenden wird der cssrewriteFilter beispielsweise auf die eingezogenen Dateien angewendet.

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

Wenn Sie jemals die Ausgabe Ihrer Frontend-Assets programmgesteuert ändern wollten,  assetickönnen Sie dies tun, indem Sie benutzerdefinierte Zweigfilter schreiben.

Dies ist jedoch leistungsintensiv. In der Produktion sieht der generierte HTML-Code so aus, anstatt jede Datei einzeln über die PHP-Front-Controller-Datei zu verknüpfen

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

Woher kommt as5s31l.jsdas? Das macht der assetic:dumpBefehl. Es kombiniert alle einzelnen Javascript / CSS-Dateien (nach Anwendung der Filter) und erstellt eine schöne, statische, zwischenspeicherbare Datei für die Produktion.

Was musst du machen

Es sei denn , das Projekt , das Sie ausdrücklich etwas anderes sagt, sollten Sie immer laufen assets:installund assetic:dump, weil Sie nie diese Befehle verwenden , welche Ihrer Dritten Bündel kennen. Sie müssen nur ausgeführt werden, assetic:dumpbevor Sie die Anwendung im prodModus bereitstellen oder anzeigen. Reihenfolge ist irrelevant.

Welches System Ihr Bundle verwenden soll - wenn Sie die obigen Informationen gelesen haben und nicht sicher sind, was Sie assetictun können, verwenden Sie assets. Es wird Dir gut gehen.

Alan Storm
quelle
11
Dies ist eine fantastische Antwort, danke. Ich glaube nicht, dass die Unterscheidung irgendwo in den Symfony-Dokumenten gemacht wird, und Ihre Antwort klärt die Dinge auf.
Richard Keller
Vielen Dank für die Klarstellung. Wo du angegeben hast, <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> meintest du eigentlich <script type="text/javascript" src="app.php/js/as5s31l.js"></script>
Sam Anthony
@Sam Wahrscheinlich - obwohl ich vielleicht "/js/as5s31l.js" gemeint habe --- Ich kann mich nicht erinnern, was Symfony generiert, und habe kein aktives Projekt zum Testen zur Hand.
Alan Storm
Danke auch für diese Antwort. Wenn Dateien einzeln über den Dev Front Controller bereitgestellt werden, bedeutet dies, dass kein Sass-Filter für die Verarbeitung von SCSS-Dateien in Dev Env festgelegt werden kann?
Stphane
@Stphane Ich bin nicht mit der spezifischen Frontend-Toolchain vertraut, von der Sie sprechen, aber die Idee hinter diesem System ist, dass Assetic geändert oder erweitert werden kann, um die SCSS-Verarbeitung einzuschließen.
Alan Storm