How can I force assetic to render assets each time the page is reloaded?

时光怂恿深爱的人放手 提交于 2019-11-30 07:05:19

I'm using Assetic's Lessphp filter that caches files too. For myself I've created a class that extends default Assetic's filter and touches every file with current time

<?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);
    }
}

And you must set "assetic.filter.lessphp.class" in your parameters section (services.yml):

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

AFAIK there's no perfect solution for this yet

I use:

php app/console assetic:dump --watch

which will compile your .less files each time it detects a change in any of the .less files referenced on your templates.

To force a compilation you have to make any change in your "main" file (the file that @imports the others). But, the good news are that is just enough to "touch" the file to do that. So you can just manually touch it every time you need:

touch ~/web/css/main.less;

Or, what i usually do is to set up a script that touches this "main" file each 60 seconds or so:

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

This should work on linux and mac.

Hope it helps. At least temporarily :)

Slava Fomin II

I've created a simple script to solve this problem. Please try it out and let me know if it helped.

#!/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 <s.fomin@betsol.ru>  
# 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

I really hope Symfony developers will address this issue in the future versions of the Assetic bundle. I believe it's a serious limitation.

ruian

You should pass to use_controller: false and compile your assets after you finish your modification.

If you want to compile your assets:

php app/console assetic:dump
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!