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

Eva*_*uss 12 less symfony assetic

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

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

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

在config.yml中,我将assetic use_controller设置为true.

# Assetic Configuration
assetic:
debug:          %kernel.debug%
use_controller: true
Run Code Online (Sandbox Code Playgroud)

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

我的问题是我使用一个主project.less文件,我导入所有其他.less文件

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

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

...
Run Code Online (Sandbox Code Playgroud)

它允许我保持一个干净的结构,也可以从供应商导入.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 %}    
Run Code Online (Sandbox Code Playgroud)

由于此主.less文件永远不会被修改,因此Assetic不会重新编译资产.这就是为什么我希望文件无论是否被修改都无关紧要.

Mig*_*ias 11

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

我用:

php app/console assetic:dump --watch
Run Code Online (Sandbox Code Playgroud)

每当它检测到模板中引用的任何.less文件发生更改时,它将编译.less文件.

强制编译,您必须在"主"文件(@imports其他文件)中进行任何更改.但是,好消息是,这足以"触摸"文件来做到这一点.因此,您可以在每次需要时手动触摸它:

touch ~/web/css/main.less;
Run Code Online (Sandbox Code Playgroud)

或者,我通常做的是设置一个脚本,每60秒左右触摸一次这个"主"文件:

while true; do
    sleep 60
    touch ~/web/css/main.less
done
Run Code Online (Sandbox Code Playgroud)

这应该适用于linux和mac.

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


小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

parameters:
    assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter
Run Code Online (Sandbox Code Playgroud)


小智 0

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

如果您想编译您的资产:

php app/console assetic:dump
Run Code Online (Sandbox Code Playgroud)

  • 有用。然而,这意味着每次修改文件时,我都必须执行该命令。这是一种痛苦。如果我向命令添加 --watch 参数,那么我会遇到与上述完全相同的问题。 (2认同)