12

ページがリロードされるたびにアセットを強制的にレンダリングするにはどうすればよいですか(アセットが変更されているかどうかに関係なく)?

私の問題についてのより多くの説明:

私は現在、Asseticを使用して.lessファイルを管理およびコンパイルするSymfony2プロジェクトに取り組んでいます。すべて正常に動作しましたが、修正したい小さな問題があります。

config.ymlで、asseticuse_controllerをtrueに設定しました。

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

その結果、.lessファイルが変更されるたびにSymfonyは新しい.cssファイルを動的にレンダリングします。これは素晴らしい。

私の問題は、他のすべての.lessファイルをインポートするメインのproject.lessファイルを使用することです。

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

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

...

これにより、クリーンな構造を維持し、ベンダーから.lessファイルをインポートすることもできます(例:twitterブートストラップ)。

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

私の知る限り、これに対する完璧な解決策はまだありません

私が使う:

php app/console assetic:dump --watch

これにより、テンプレートで参照されている .less ファイルのいずれかで変更が検出されるたびに、.less ファイルがコンパイルされます。

コンパイルを強制するには、「メイン」ファイル (他のファイルを @import するファイル) に変更を加える必要があります。しかし、良いニュースは、それを行うためにファイルに「触れる」だけで十分だということです。したがって、必要なときにいつでも手動で触れることができます。

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 に答える
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 に答える
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

You should pass to use_controller: false and compile your assets after you finish your modification.

If you want to compile your assets:

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