12

如何在每次重新加载页面时强制assetic呈现资产(无论资产是否被修改)?

关于我的问题的更多解释:

我目前正在开发一个 Symfony2 项目,我使用 Assetic 来管理和编译 .less 文件。我得到了一切正常工作,但我有一个小问题,我想解决。

在 config.yml 中,我将资产 use_controller 设置为 true。

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

结果是 Symfony 每次修改 .less 文件时都会动态呈现新的 .css 文件。这很棒。

我的问题是我使用了一个主 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 不会重新编译资产。这就是为什么我希望它渲染文件不管它们是否被修改。

4

4 回答 4

11

我正在使用 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);
    }
}

您必须在参数部分(services.yml)中设置“assetic.filter.lessphp.class”:

parameters:
    assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter
于 2012-12-31T09:47:36.940 回答
11

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。

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

于 2012-12-13T14:58:41.500 回答
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 包中解决这个问题。我相信这是一个严重的限制。

于 2012-10-20T05:20:03.013 回答
0

use_controller: false完成修改后,您应该传递并编译您的资产。

如果你想编译你的资产:

php app/console assetic:dump
于 2012-08-22T15:37:01.127 回答