每次重新加载页面时,如何强制资产来呈现资产?

时间:2012-08-22 14:50:44

标签: symfony less assetic

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

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

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

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

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

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

我的问题是我使用一个主项目。无文件,我导入所有其他.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 个答案:

答案 0 :(得分: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。

希望它有所帮助。至少暂时:)

答案 1 :(得分: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

答案 2 :(得分:3)

我已创建a simple 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 <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捆绑包的未来版本中解决这个问题。我认为这是一个严重的限制。

答案 3 :(得分:0)

您应该在完成后转到use_controller: false并编译您的资产 你的修改。

如果您想编译资产:

php app/console assetic:dump