Подтвердить что ты не робот

Как я могу заставить assetic визуализировать активы каждый раз, когда страница перезагружается?

Как я могу заставить assetic визуализировать активы каждый раз, когда страница перезагружается (независимо от того, изменены ли активы или нет)?

Подробнее о моей проблеме:

В настоящее время я работаю над проектом Symfony2, где я использую Assetic для управления и компиляции бездействующих файлов. У меня есть все, чтобы работать нормально, но у меня есть небольшая проблема, которую я хотел бы исправить.

В config.yml, я установил assetic use_controller в true.

# Assetic Configuration
assetic:
debug:          %kernel.debug%
use_controller: true

В результате Symfony динамически отображает новые .css файлы каждый раз, когда файлы без изменений изменяются. Это здорово.

Моя проблема в том, что я использую основной файл project.less, в котором я импортирую все остальные .less файлы

// Import Twitter Bootstrap
@import "../../../../../../vendor/twitter/bootstrap/less/bootstrap.less";

// Import Foo
@import "foo.less";

...

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

В моем шаблоне Twig я называю этот главный файл.

{% stylesheets '@ProjectWebBundle/Resources/public/less/project.less' filter='less' %}
        <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" />
{% endstylesheets %}    

Поскольку этот основной .less файл никогда не изменяется, Assetic не перекомпилирует активы. Вот почему я хотел бы, чтобы они отображали файлы неважно, были ли они изменены или нет.

4b9b3361

Ответ 1

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

<?php

namespace Xxx\AssetsBundle\Assetic\Filter;

use Assetic\Asset\AssetInterface;
use Assetic\Filter\LessphpFilter;

class LessphpNonCachedFilter extends LessphpFilter
{
    public function filterLoad(AssetInterface $asset)
    {
        $root = $asset->getSourceRoot();
        $path = $asset->getSourcePath();

        $filename = realpath($root . '/' . $path);

        if (file_exists($filename)) {
            touch($filename);
        }

        parent::filterLoad($asset);
    }
}

И вы должны установить "assetic.filter.lessphp.class" в разделе параметров (services.yml):

parameters:
    assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter

Ответ 2

AFAIK нет идеального решения для этого еще

Я использую:

php app/console assetic:dump --watch

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

Чтобы заставить компиляцию внести какие-либо изменения в ваш "основной" файл (файл, который @imports остальные). Но хорошей новостью является то, что этого достаточно, чтобы "прикоснуться" к файлу, чтобы сделать это. Поэтому вы можете просто вручную прикасаться к нему каждый раз, когда вам нужно:

touch ~/web/css/main.less;

Или, что я обычно делаю, это настроить script, который касается этого "основного" файла каждые 60 секунд или около того:

while true; do
    sleep 60
    touch ~/web/css/main.less
done

Это должно работать на linux и mac.

Надеюсь, это поможет. По крайней мере временно:)

Ответ 3

Я создал простой script, чтобы решить эту проблему. Пожалуйста, попробуйте и дайте мне знать, если это поможет.

#!/bin/bash

# assetic-watch: A very simple shell-script to recursively and efficiently
# watch for asset changes and to trigger automatic recompilation.
#
# By Slava Fomin II <[email protected]>  
# Feel free to contact me.
# From Russia with Love.
# Let make this World a Better place!
# --------------------------------------

#===============#
# CONFIGURATION #
#===============#

# Path relative to "Symfony/src" directory.
# File changes under specified directory will trigger recompilation
# of all assets.
WATCH_PATH="Name/Bundle/NameBundle/Resources/public/css"

# Environment.
ENV="dev"

# Additional options for "app/console".
OPTS=""

# inotifywait events to watch for.
INW_EVENTS="close_write,moved_to,create"

# Optional inotifywait arguments.
INW_OPTS=""

# Relative path to the Symfony root directory.
SYMFONY_PATH="../"

#============#
# PROCESSING #
#============#

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
CONSOLE_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/app/console"
SRC_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/src/$WATCH_PATH"

quietly() { "[email protected]" > /dev/null 2>&1; }

while true; do
    quietly inotifywait --recursive -e $INW_EVENTS $INW_OPTS $SRC_PATH
    php $CONSOLE_PATH assetic:dump --env=$ENV $OPTS
done

Я очень надеюсь, что разработчики Symfony рассмотрят эту проблему в будущих версиях Assetic bundle. Я считаю это серьезным ограничением.

Ответ 4

Вы должны перейти на use_controller: false и скомпилировать свои активы после завершения ваша модификация.

Если вы хотите скомпилировать свои активы:

php app/console assetic:dump