Статические ресурсы не обновляются с помощью команды symfony2 clear cache

Я использую Assetic с фильтром компаса для передачи и компиляции файлов .scss. Эта часть установки, кажется, работает нормально. Однако я понимаю, что в среде app_dev Symfony 2 будет перекомпилировать все ресурсы (включая css) для каждой загрузки страницы и не использовать систему кэширования, которую использует для среды prod.

Кажется, этого не происходит.

Когда я внесу изменение в файл .scss, он вступит в силу, только если я использую:

 app/console cache:clear

Я думал, что весь смысл среды разработки заключается в том, чтобы избежать необходимости делать это каждый раз ?!

Я проверил права доступа к папкам кеша (чтобы быть уверенным, я установил их так, чтобы каждый мог читать и писать). У кого-нибудь есть предложения?

 solarc10 июл. 2012 г., 23:53
Я использую Symfony сless и он перекомпилирует его при каждом запросе, если изменения вносятся в фактически включенный файл, а не в файлы, импортированные из этого. Может быть, это твоя проблема?

Ответы на вопрос(6)

имо переустанавливать ресурсы при внесении изменений независимо от среды.

app/console assets:install web

Если файловая система, на которой вы работаете, поддерживает символические ссылки, вы можете не запускать эту команду для каждого изменения, а просто установить ресурсы как таковые.

app/console assets:install web --symlink

Но поскольку вы используете Sass, это, вероятно, не вариант для вас.

НТН

 musoNic8011 июл. 2012 г., 12:47
Извини, Питер, мне следовало быть понятнее. Я говорю только о файлах активов (css, js), а не об активах, таких как изображения. В документах (symfony.com/doc/current/cookbook/assetic/asset_management.html) в нем говорится, что в среде разработчика эти активы обрабатываются динамически, и изменения должны быть видны немедленно.
Решение Вопроса

компасный фильтр компаса, css не обновляется при изменении импортируемого файла (обсуждение групп google)

Похоже, что если в импортированный файл внесены изменения без каких-либо изменений в родительский файл, то родительский файл не будет перекомпилирован. Результат изменения не будет виден, пока вы не выполните принудительную перекомпиляцию.

Постер в группах Google предложил возможное исправление (взлом!) Путем редактирования AsseticController. Я еще не пробовал, но даже если это работает, я бы не стал редактировать пакет поставщика.

что это старая тема, но единственными ответами, которые я мог бы получить, были CompassElephantBundle и вышеупомянутый хак AsseticController. У меня есть подход, который по сути, но означает, что мне не нужно было редактировать пакет поставщика.

То, как я это сделал, это отредактировать копию оригинального AsseticController и затем связать его с этим в конфигурации из параметров.

parameters:
    assetic.controller.class: Acme\RandomBundle\Controller\AsseticController

Скопированный AsseticController просто делает preg_match для типа файла из исходного пути и исправляет кеширование оттуда.

<?php

/* Original Assetic Controller */

public function render($name, $pos = null)
{
    if (!$this->enableProfiler && null !== $this->profiler) {
        $this->profiler->disable();
    }

    if (!$this->am->has($name)) {
        throw new NotFoundHttpException(sprintf('The "%s" asset could not be found.', $name));
    }

    $asset = $this->am->get($name);
    if (null !== $pos && !$asset = $this->findAssetLeaf($asset, $pos)) {
        throw new NotFoundHttpException(sprintf('The "%s" asset does not include a leaf at position %d.', $name, $pos));
    }

    $bustCache = preg_match('/\.(scss|sass|less)$/', $asset->getSourcePath());

    $response = $this->createResponse();
    $response->setExpires(new \DateTime());

    if ($bustCache) {
        $lastModified = time();
        $date = new \DateTime();
        $date->setTimestamp($lastModified);
        $response->setLastModified($date);
    }
    else
    {
        // last-modified
        if (null !== $lastModified = $asset->getLastModified()) {
            $date = new \DateTime();
            $date->setTimestamp($lastModified);
            $response->setLastModified($date);
        }
    }

    // etag
    if ($this->am->hasFormula($name)) {
        $formula = $this->am->getFormula($name);
        $formula['last_modified'] = $lastModified;
        $response->setETag(md5(serialize($formula)));
    }

    if ($response->isNotModified($this->request)) {
        return $response;
    }

    if ($bustCache) {
        $response->setContent($asset->dump());
    }
    else {
        $response->setContent($this->cachifyAsset($asset)->dump());
    }

    return $response;
}

/* Rest of controller */

если вы работаете с ресурсами Symfony 2 в dev. среда, просто используйтеэта команда:

php app/console assets:install
php app/console assetic:dump --watch

Начиная с версии 2.4--watch is deprecatedи был заменен:

php app/console assetic:watch
 26 мая 2016 г., 16:47

Я исправил эту проблему в локальной разработке, добавив в конец моего файла parameters.yml строку, которая в основном останавливает кэширование любых ресурсов.

# parameters.yml
...

assetic.cache.class: Assetic\Cache\ArrayCache

Это должноnever быть включенным в производственную среду, поскольку мы хотим, чтобы кэширование происходило!

тки

    {% block stylesheets %}
        {% stylesheets filter,='?uglifycss' filter='cssrewrite' filter="compass"
            "@TESTSSassBundle/Resources/public/css/_vars.scss" <-- this will be removed
            "@TESTSSassBundle/Resources/public/css/main.scss"
            "@TESTSSassBundle/Resources/public/css/header.scss"
            "@TESTSSassBundle/Resources/public/css/footer.scss"
         %}
            <link rel="stylesheet" href="{{ asset_url }}" />
        {% endstylesheets %}
    {% endblock %}  

и после того, как я закончу разработку, я удаляю их. Таким образом, мне не нужно очищать кэш и добавлять / изменять любые настройки. Это всегда работает для меня.

Ваш ответ на вопрос