Câu hỏi Sự khác biệt giữa assetic: dump và asset: install


Trong Symfony2, sự khác nhau giữa assetic:dump và assets:install? Trong những kịch bản nào nên sử dụng các lệnh này, và theo thứ tự nào (nếu thứ tự có liên quan)?


76
2018-04-04 21:16


gốc




Các câu trả lời:


Tôi thực sự đã viết về điều này gần đây trong một bài viết về OroCRM, dựa trên Symfony 2. Nếu bạn muốn một số bối cảnh / tại sao các lệnh khác nhau, bạn có thể thấy nó thú vị.

Có hai hệ thống khác nhau để bao gồm các tệp giao diện người dùng (javascript, css, hình ảnh, v.v.) trong một ứng dụng Symfony. Các assets:install lệnh đến trước. Lệnh này sẽ tìm kiếm tất cả các gói Symfony trong một ứng dụng cho một

Resources/public

thư mục. Nếu tìm thấy, assets:install lệnh sẽ sao chép hoặc liên kết các tệp từ Resources/public đến web/public/bundle/[bundle-name]. Đây là nơi các liên kết được tạo bằng cành cây assets chức năng sẽ tìm những tập tin này. Điều này

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

Trở thành cái này

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

Đó là tất cả assets hệ thống. Nó cho phép bạn lưu trữ các tệp giao diện người dùng của bạn với gói.

Các assetic hệ thống là khác nhau. Với assetic, bạn liên kết đến các tệp như thế này.

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

Có các thẻ tương tự cho biểu định kiểu và hình ảnh. Thông báo rằng assetic cho phép bạn liên kết đến các tệp trong bất kì bó. (@AcmeFooBundle). Assetic cũng sẽ cho phép bạn liên kết tới nhiều tệp trong một thư mục với ký tự đại diện.

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

Một sự khác biệt với assetic nằm trong các liên kết được tạo. bên trong dev môi trường chúng sẽ trông giống như thế này.

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

Nghĩa là, các yêu cầu cho các tệp này sẽ chạy qua bộ điều khiển phía trước PHP (app_dev.php) thông qua các tuyến đường đặc biệt được thiết lập trong assetic bó. Điều này có nghĩa là, khi bạn ở dev chế độ, bạn không bao giờ cần phải đổ tài sản của bạn. Chúng được bao gồm tự động. Nó cũng cho phép bạn áp dụng bộ lọc cho các tập tin. Ví dụ: sau đây áp dụng cssrewrite lọc các tệp được lấy vào.

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

Nếu bạn muốn thay đổi chương trình của tài sản giao diện người dùng của bạn theo chương trình -assetic cho phép bạn làm điều đó bằng cách viết các bộ lọc tùy chỉnh.

Tuy nhiên, đây là hiệu suất chuyên sâu. Trong sản xuất, thay vì liên kết từng tệp riêng lẻ thông qua tệp bộ điều khiển phía trước PHP, HTML được tạo sẽ trông giống như sau

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

Nơi nào as5s31l.js đến từ? Đó là những gì assetic:dump lệnh. Nó kết hợp tất cả các tệp javascript / css riêng lẻ (sau khi áp dụng các bộ lọc) và tạo tệp đẹp, tĩnh, có thể lưu vào bộ nhớ cache để sản xuất.

Bạn cần gì để làm

Trừ khi dự án cụ thể cho bạn biết cách khác, bạn nên luôn chạy assets:install và assetic:dump, bởi vì bạn sẽ không bao giờ biết được các gói bên thứ ba nào của bạn sử dụng các lệnh này. Bạn chỉ cần chạy assetic:dump trước khi bạn triển khai hoặc xem ứng dụng trong prod chế độ. Đơn đặt hàng không liên quan.

Đối với hệ thống mà gói của bạn nên sử dụng - nếu bạn đã đọc ở trên và bạn không chắc chắn về những gì assetic có thể làm cho bạn, sử dụng assets. Bạn sẽ ổn thôi.


129
2018-04-05 01:14



Đây là một câu trả lời tuyệt vời, cảm ơn bạn. Tôi không tin rằng sự khác biệt được tạo ra ở bất cứ đâu trong các tài liệu của Symfony, và câu trả lời của bạn sẽ xóa bỏ mọi thứ. - Richard Keller
Cảm ơn bạn đã làm rõ điều này. Nơi bạn đã nói <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script>  ý bạn là <script type="text/javascript" src="app.php/js/as5s31l.js"></script> - Sam Anthony
@Sam Có lẽ - mặc dù tôi có thể có nghĩa là "/js/as5s31l.js" --- Tôi không thể nhớ những gì Symfony tạo ra và không có một dự án đang hoạt động để kiểm tra. - Alan Storm
Cảm ơn bạn cũng vì câu trả lời này. Nếu các tập tin được phục vụ indivitualty throut dev front controller, điều này có nghĩa là người ta không thể thiết lập một bộ lọc sass để xử lý các tập tin scss trong dev env? - Stphane
@Stphane Tôi không quen thuộc với các toolchain frontend cụ thể mà bạn đang nói về, nhưng ý tưởng đằng sau hệ thống này là assetic có thể được sửa đổi hoặc mở rộng để bao gồm xử lý SCSS. - Alan Storm