我怎么能强迫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不重新编译的资产。 这就是为什么我想它使文件,如果他们已经被修改或没有都无所谓。
我使用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
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上工作。
希望能帮助到你。 至少暂时:)
我创建了一个简单的脚本来解决这个问题。 请尝试一下,让我知道,如果它帮助。
#!/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束的未来版本中解决这个问题。 我相信这是一个严重的限制。
你应该传递给use_controller: false
和编译你的资产,你完成你的修改后。
如果你想编译您的资产:
php app/console assetic:dump