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

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

Дополнительные пояснения по моей проблеме:

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

В config.yml я установил для свойства use_controller значение true.

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

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

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

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

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

...

это позволяет мне сохранять чистую структуру, а также импортировать файлы .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 не перекомпилирует активы. Вот почему я хотел бы, чтобы файлы отображались независимо от того, были они изменены или нет.


person Evarouss    schedule 22.08.2012    source источник
comment
Попробуйте {% stylesheets '@ProjectWebBundle/Resources/public/less/project.less' filter='less' debug=true %}   -  person Florent    schedule 22.08.2012
comment
Спасибо за быстрый ответ @Florent, но это не решает проблему.   -  person Evarouss    schedule 22.08.2012


Ответы (4)


Я использую фильтр 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
person Alex Z.    schedule 31.12.2012
comment
Примечание. Touch требует прав на запись. Вам нужно будет убедиться, что для вашего файла «project.less» установлены разрешения xx6. (Я установил свой на 0666.) - person Kevin; 03.02.2013
comment
Я использую от LESS до node, принцип touch остается прежним, touch файл (e.g:bootstrap.less) в вашем контроллере __construct() - он заставит перекомпилировать каждую загрузку страницы - person Anil; 09.05.2014

Насколько я знаю, для этого пока нет идеального решения.

Я использую:

php app/console assetic:dump --watch

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

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

touch ~/web/css/main.less;

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

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

Это должно работать на Linux и Mac.

Надеюсь, поможет. Хотя бы временно :)

person Miguel Trias    schedule 13.12.2012

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

#!/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's 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() { "$@" > /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. Я считаю, что это серьезное ограничение.

person Slava Fomin II    schedule 20.10.2012
comment
я не могу отблагодарить вас достаточно. в прошлый раз, когда я пробовал это, это не сработало для меня, но теперь мой env. немного отличается. На данный момент это ЕДИНСТВЕННОЕ решение, которое работает для автоматического обновления CSS, который @imported, с использованием live.js. Огромное спасибо! Я потратил слишком много времени на поиски решений, и я подумал, что вернусь к вам, потому что я знаю, что ваш сценарий крут. Наконец-то это окупилось :-) - person blamb; 06.06.2014
comment
О, спасибо @BrianThomas, рад помочь =) Сам я больше не пользуюсь ассетами, я переключился на Grunt, а теперь на Gulp для автоматической компиляции всех моих скриптов. Это очень гибкий и мощный способ управления активами. Вы даже можете использовать livereload вместе с ним. - person Slava Fomin II; 06.06.2014
comment
Я согласен, это очень разумный поступок. Пожалуйста, не стесняйтесь редактировать мой ответ и добавлять пример кода. - person Slava Fomin II; 31.05.2016

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

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

php app/console assetic:dump
person ruian    schedule 22.08.2012
comment
Оно работает. Однако это означает, что каждый раз, когда я изменяю файл, я должен выполнять эту команду. Это боль. Если я добавлю параметр --watch в команду, у меня будет точно такая же проблема, как описано выше. - person Evarouss; 22.08.2012