Дамп статического ресурса с png оптимизацией ссылается на неправильные файлы - PullRequest
3 голосов
/ 22 ноября 2011

Я пытаюсь построить проект, используя Symfony2 и все возможные оптимизации включены. Одним из таких является оптимизация изображений, используемых в HTML. Symfony2 имеет пакет Assetic, который позволяет это использовать, например, optipng прямо из шаблонов Twig. Документы здесь: http://symfony.com/doc/2.0/cookbook/assetic/jpeg_optimize.html

Проблема, с которой я столкнулся, заключается в том, что все работает в среде dev (где все ресурсы сборки собираются через контроллер), но команда CLI создает дамп в файл, не используемый в отображаемых шаблонах.

Это вывод при выводе ресурсов, файлы доступны позже в / web /assetic

Dumping all prod assets.
Debug mode is off.

[file+] /home/projects/dashboard/data/dashboard/app/../web/js/4a3b4dc.js
[file+] /home/projects/dashboard/data/dashboard/app/../web/css/9640074.css
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/1d666d2.png
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/dfaa6c9.png
[file+] /home/projects/dashboard/data/dashboard/app/../web/assetic/5f2dd31.png

Когда я просматриваю страницу, эти URL называются

<img src="/assetic/ad39e3f.png">
<img src="/assetic/69fbd4a.png">
<img src="/assetic/e4a4ede.png">

Css и JS, однако, работают.

Мой конфигурационный файл:

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    java: /usr/bin/java
    filters:
        cssrewrite: ~
        closure:
             jar: %kernel.root_dir%/Resources/java/compiler.jar
        yui_css:
             jar: %kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar
        optipng:
            apply_to: "\.png$"
            level:    3
        jpegoptim:
            apply_to: "\.jpe?g$"
            strip_all: true
    twig:
        functions:
            jpegoptim: { output: images/*.jpg }
            optipng: { output: images/*.png }

Шаблон моей веточки:

 <img src="{{ optipng('@KunstmaanDashboardBundle/Resources/public/images/foursquare-logo.png') }}" style="margin-bottom: 0;" />

Ответы [ 2 ]

4 голосов
/ 19 июля 2013

Я работал над этой проблемой, выполняя некоторые тесты с двумя возможными синтаксисами веток.

<!-- standard syntax: -->
{% image 'img/promo/widget.autopromo.testimonial.jpg' filter='jpegoptim' output='img/*.js' %}
    <img src="{{ asset_url }}" alt="Example"/>
{% endimage %}

<!-- twig function: -->
<img src="{{ jpegoptim('img/promo/widget.autopromo.activity.jpg') }}" />

Я начал со следующей конфигурации

assetic:
  debug:          %kernel.debug%
  use_controller: %kernel.debug%
  read_from:      %kernel.root_dir%/../web/static/
  write_to:       %kernel.root_dir%/../web/static/optimasset

  filters:
    jpegoptim:
      bin: /usr/bin/jpegoptim
      apply_to: "\.jpe?g$"
      strip_all: true
  twig:
    functions:
        jpegoptim: ~

между каждым изменением я запускал следующие команды, чтобы убедиться, что кэш очищен и новые файлы сбрасываются.

rm -Rvf app/cache/* # yes I wanted to make that sure cache is cleared
rm -Rvf web/static/optimasset; 
app/console cache:clear --no-warmup; 
app/console assetic:dump

1010 *
*

00 Сначала вывод дампа был

web/static/optimasset/images/e749c9f.jpg
web/static/optimasset/images/e749c9f_widget.autopromo.testimonial_1.jpg
web/static/optimasset/assetic
web/static/optimasset/assetic/bb69582.jpg
web/static/optimasset/assetic/bb69582_widget.autopromo.activity_1.jpg

и сгенерированный html

<img src="/static/images/e749c9f_widget.autopromo.testimonial_1.jpg" alt="Example">
<img src="/static/assetic/c03bc54.jpg">

Примечание:

  • функция ветки генерирует неправильное имя файла.
  • Оба учитывают параметр write_to в config.yml при дампе ресурсов, но все равно создают папку по умолчанию (assetic/ или images).
  • Оба игнорируют параметр write_to при создании html, но используют их папку по умолчанию, следующую за папкой, указанной в framework.templating.assets_base_urls.http
  • Функция Twig генерирует HTML с неправильным именем файла


01 Указание выходного каталога в config.yml

filters:
    jpegoptim:
        bin: /usr/bin/jpegoptim
        apply_to: "\.jpe?g$"
        strip_all: true
        output:'img/*.jpg' # just a test
twig:
    functions:
        jpegoptim: {output:'img/*.jpg'} # according to documentation

Примечание: Вы получите точно такой же результат. Ни один из синтаксисов не обрабатывает «вывод» из конфигурации (только в ветке).


02 Указание вывода в шаблоне веточки

Кстати, я добавил optimasset/ к выходному пути, потому что рендеринг не учитывает значение `` `` write_to```.

{% image 'img/promo/widget.autopromo.testimonial.jpg' filter='jpegoptim' output='optimasset/img/*.jpg' %}
    <img src="{{ asset_url }}" alt="Example"/>
{% endimage %}

<img src="{{ jpegoptim('img/promo/widget.autopromo.activity.jpg', {output:'optimasset/img/*.jpg'}) }}" />

свалка:

web/static/optimasset/optimasset/img
web/static/optimasset/optimasset/img/974c414.jpg
web/static/optimasset/optimasset/img/974c414_widget.autopromo.testimonial_1.jpg
web/static/optimasset/optimasset/img/c230e9e.jpg
web/static/optimasset/optimasset/img/c230e9e_widget.autopromo.activity_1.jpg

отображать как:

<img src="/static/optimasset/img/974c414_widget.autopromo.testimonial_1.jpg" alt="Example">
<img src="/static/optimasset/img/080b62e.jpg">

Примечание: Рендеринг правильный, но путь к дампу - нет. Чтобы это исправить, мне пришлось удалить параметр write_to.


ЗАКЛЮЧЕНИЕ

  • {{ optipng(...) }} как {{ jpegoptim(...) }} никогда не выводит правильное имя файла. Используйте синтаксис {% images ... %}.
  • Вы не должны использовать write_to, если вы используете сборку для фильтрации изображений {% images%} не учитывает это при рендеринге html, только {% javascripts %} и {% stylesheets %} делают.
1 голос
/ 22 ноября 2011

А вы уже читали Использование Assetic в Symfony2 для сжатия CSS уже?Это может быть странное поведение, о котором они говорят, поэтому перейдите к пункту 4 на этой странице и посмотрите на упомянутый запрос на извлечение (https://github.com/symfony/symfony/pull/509). Это может решить вашу проблему: p.

...