我怎么能强迫assetic渲染资产每个页面重新加载时间?(How can I force asset

2019-06-27 05:57发布

我怎么能强迫assetic渲染资产每个页面重新加载(无论资产进行修改或没有)的时间?

关于我的问题的详细解释:

我目前工作的地方我用Assetic管理和编译.LESS文件Symfony2的项目。 我得到的一切工作正常,但我有一个小问题,我想修复。

在config.yml,我的assetic 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的引导。

在我的枝条模板,我只把这个主文件。

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

由于这主要.LESS文件绝不会被修改,Assetic不重新编译的资产。 这就是为什么我想它使文件,如果他们已经被修改或没有都无所谓。

Answer 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


Answer 2:

AFAIK有这个没有完美的解决方案

我用:

php app/console assetic:dump --watch

这将编译.LESS文件每次检测的任何模板上的引用文件.LESS的改变时间。

强制编译你必须让你的“主”文件(即@imports其他文件)的任何变化。 不过,好消息是,这只是够“触摸”的文件来做到这一点。 所以,你可以手动每次你需要一次触摸它:

touch ~/web/css/main.less;

或者,我最常做的是建立触及这个“主”文件各60秒左右的脚本:

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

这应该在Linux和Mac上工作。

希望能帮助到你。 至少暂时:)



Answer 3:

我创建了一个简单的脚本来解决这个问题。 请尝试一下,让我知道,如果它帮助。

#!/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

我真的希望Symfony的开发商将在Assetic束的未来版本中解决这个问题。 我相信这是一个严重的限制。



Answer 4:

你应该传递给use_controller: false和编译你的资产,你完成你的修改后。

如果你想编译您的资产:

php app/console assetic:dump


文章来源: How can I force assetic to render assets each time the page is reloaded?