每次重新加载页面时,如何强制资产来呈现资产(无论资产是否被修改)?
关于我的问题的更多解释:
我目前正在开发一个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不会重新编译资产。这就是为什么我希望文件无论是否被修改都无关紧要。
答案 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