13

我正在使用带有罗盘过滤器的 Assetic 来传递和编译 .scss 文件。这部分设置似乎工作正常。然而,我的理解是,在 app_dev 环境中,Symfony 2 将为每个页面加载重新编译所有资产(包括 css),而不使用它用于 prod 环境的缓存系统。

这似乎没有发生。

当我对 .scss 文件进行更改时,它只有在我使用时才会生效:

 app/console cache:clear

我认为开发环境的重点是避免每次都这样做?!

我已经检查了缓存文件夹的权限(为了安全起见,我已经设置它们以便任何人都可以读写)。有人有什么建议吗?

4

6 回答 6

15

如果您在开发中使用 symfony 2 资产。环境,只需使用以下命令

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

由于版本 2.4--watch已弃用,并已替换为:

php app/console assetic:watch
于 2013-03-12T10:11:44.833 回答
10

我想我在这里找到了答案:

资产指南针过滤器,更改导入文件时css不更新(谷歌小组讨论)

似乎如果对导入的文件进行了更改而不对父文件进行任何更改,则不会重新编译父文件。在您强制重新编译之前,不会看到更改的结果。

谷歌组的海报通过编辑 AsseticController 提出了一个可能的修复(hack!)。我还没有尝试过,但即使它有效,我也不想编辑供应商包。

于 2012-07-11T10:52:55.280 回答
3

资产编译不是缓存系统的一部分。无论环境如何,您都需要在进行更改时重新安装资产。

app/console assets:install web

如果您所在的文件系统支持符号链接,您可以避免每次更改都运行此命令,而只需安装资产

app/console assets:install web --symlink

但是由于您使用的是 Sass,因此这可能不适合您。

高温高压

于 2012-07-10T18:11:10.367 回答
3

我知道这是一个老话题,但我唯一能接受的答案是 CompassElephantBundle 和上面的 AsseticController hack。我有一种方法,本质上但意味着我不必编辑供应商包。

我这样做的方法是编辑复制原始 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 */
于 2012-11-01T14:49:40.103 回答
2

我已经在本地开发中解决了这个问题,在我的 parameters.yml 末尾添加了一行,这基本上阻止了任何资产缓存的发生。

# parameters.yml
...

assetic.cache.class: Assetic\Cache\ArrayCache

应该包含在生产环境中,因为我们希望缓存发生!

于 2014-01-10T16:06:17.577 回答
0

我用不同的方式。我在开发过程中添加了所有 .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 %}  

在我完成开发后,我将它们删除。这样我就不需要清除我的缓存和添加/更改任何设置。它总是对我有用。

于 2015-06-19T08:10:08.277 回答