Подтвердить что ты не робот

Статические активы, не обновляющиеся командой symfony2 clear cache

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

Это, похоже, не происходит.

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

 app/console cache:clear

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

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

4b9b3361

Ответ 1

Я думаю, что нашел ответ здесь:

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

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

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

Ответ 2

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

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

Поскольку версия 2.4 --watch устарела и была заменена на:

php app/console assetic:watch

Ответ 3

Компиляция активов не является частью системы кэширования. Вам необходимо переустанавливать активы при внесении изменений независимо от среды.

app/console assets:install web

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

app/console assets:install web --symlink

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

НТН

Ответ 4

Я знаю, что это старая тема, но единственными ответами, которые я мог бы оценить, были 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 */

Ответ 5

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

# parameters.yml
...

assetic.cache.class: Assetic\Cache\ArrayCache

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

Ответ 6

Я использую другой способ. Я добавляю все .scss файлы во время разработки

    {% 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 %}  

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