Sự khác biệt giữa assetic: dump và asset: install


81

Trong Symfony2, sự khác biệt giữa assetic:dumpassets:install? Mỗi lệnh này nên được sử dụng trong tình huống nào và theo thứ tự nào (nếu thứ tự có liên quan)?

Câu trả lời:


137

Tôi thực sự đã viết về điều này gần đây trong một bài báo về OroCRM, dựa trên Symfony 2. Nếu bạn muốn một số ngữ cảnh / lý do của 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:installlệnh đến đầu tiên. Lệnh này sẽ tìm kiếm tất cả các Gói Symfony trong một ứng dụng để tìm

Resources/public

thư mục. Nếu được tìm thấy, assets:installlệnh sẽ sao chép hoặc liên kết biểu tượng các tệp từ Resources/publictới web/public/bundle/[bundle-name]. Đây là nơi các liên kết được tạo bằng assetshàm twig sẽ tìm kiếm các tệp 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ả những gì assetshệ thống làm. Nó cho phép bạn lưu trữ các tệp giao diện người dùng của mình với gói.

Các assetichệ 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 bảng định kiểu và hình ảnh. Lưu ý rằng asseticcho phép bạn liên kết đến các tệp trong bất kỳ gói nào . ( @AcmeFooBundle). Assetic cũng sẽ cho phép bạn liên kết đến nhiều tệp trong một thư mục bằng 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 asseticlà trong các liên kết được tạo ra. Trong devmô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 thiết lập các tuyến đặc biệt trong asseticgói. Điều này có nghĩa là, khi bạn đang ở devchế độ, bạn không bao giờ cần phải bán tài sản của mình. Chúng được đưa vào tự động. Nó cũng cho phép bạn áp dụng các bộ lọc cho các tệp. Ví dụ: phần sau áp dụng cssrewritebộ lọc cho các tệp được kéo vào.

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

Nếu bạn từng muốn lập trình thay đổi đầu ra của nội dung giao diện người dùng - hãy  asseticcho phép bạn làm điều đó bằng cách viết các bộ lọc nhánh 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 điều khiển phía trước PHP, HTML được tạo sẽ giống như thế này

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

Từ đâu as5s31l.jsđến? Đó là những gì assetic:dumplệnh làm. 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 ra một 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 cho bạn biết cách khác, bạn nên luôn chạy assets:installassetic:dumpvì bạn sẽ không bao giờ biết gói bên thứ ba nào của mình sử dụng các lệnh này. Bạn chỉ cần chạy assetic:dumptrước khi triển khai hoặc xem ứng dụng ở prodchế độ. Thứ tự 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 phần trên và bạn không chắc chắn những gì asseticcó thể làm cho mình, hãy sử dụng assets. Bạn sẽ ổn thôi.


11
Đâ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 kỳ đâu trong các tài liệu của Symfony, và câu trả lời của bạn đã làm sáng tỏ mọi thứ.
Richard Keller

Cảm ơn vì đã làm rõ điều này. Trong trường hợp bạn đã nêu <script type="text/javascript" src="app_dev.php/js/as5s31l.js"></script> cậu thực sự có nghĩa <script type="text/javascript" src="app.php/js/as5s31l.js"></script>
Sam Anthony

@Sam Có thể - mặc dù tôi có thể có nghĩa là "/js/as5s31l.js" --- Tôi không thể nhớ Symfony tạo ra những gì và không có một dự án đang hoạt động để kiểm tra.
Alan Storm

Cảm ơn bạn quá cho câu trả lời này. Nếu các tệp được cung cấp bộ điều khiển phía trước của dev indivitualty, điều này có nghĩa là người ta không thể đặt bộ lọc sass để xử lý các tệp scss trong dev env?
Stphane

@Stphane Tôi không quen với chuỗi công cụ giao diện người dùng cụ thể mà bạn đang nói đến, 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.