Статические активы, не обновляющиеся командой symfony2 clear cache
Я использую Assetic с фильтром компаса для передачи и компиляции файлов .scss. Эта часть установки работает нормально. Однако я понял, что в среде app_dev Symfony 2 перекомпилирует все активы (включая css) для каждой загрузки страницы, а не использует систему кэширования, которую она использует для среды prod.
Это, похоже, не происходит.
Когда я вношу изменения в .scss файл, он вступает в силу, если я использую:
app/console cache:clear
Я думал, что вся суть среды dev заключается в том, чтобы не делать этого каждый раз?!
Я проверил разрешения на кеш-папки (чтобы быть в безопасности, я их установил, чтобы кто-нибудь мог читать и писать). Есть ли у кого-нибудь предложения?
Ответы
Ответ 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 %}
и после завершения разработки я удаляю их.
Таким образом, мне не нужно очищать кеш и добавлять/изменять любые настройки. Это всегда работает для меня.