2012-07-10 22 views
12

コンパスフィルタでAsseticを使用して、.scssファイルを渡してコンパイルしています。セットアップのこの部分は正常に動作しているようです。しかし、私の理解では、app_dev環境では、Symfony 2は各ページの読み込みごとにすべてのアセット(cssを含む)を再コンパイルし、プロダクト環境用に使用するキャッシュシステムを使用しませんでした。symfony2でキャッシュされていない静的資産clear cacheコマンド

これは起こっていないようです。私は、私が使用している場合、それだけで有効になります.scssファイルに変更加えると

app/console cache:clear 

を私はdevの環境の全体のポイントは、このたびを行うことを避けるためにだと思いました!

私は(誰もが読み書きできるように、私はそれらを設定して安全のために)キャッシュフォルダのパーミッションをチェックしました。誰か提案はありますか?

+0

symfonyを** less **と使用し、変更が実際にインクルードされたファイルであり、そのファイルからインポートされたファイルではない限り、リクエストごとに再コンパイルします。多分それはあなたの問題ですか? – solarc

答えて

10

は、私はここに答え見つけたと思う:

assetic compass filter, css not updating when changing imported file (google groups discussion)

それはそうと、その変更は、親ファイルの親を変更することなく、インポートファイルに行われた場合ファイルは再コンパイルされません。結果は、再コンパイルを強制するまで表示されません。

Googleグループのポスターは、AsseticControllerを編集することで可能な修正(ハック!)を提案しました。私はまだそれを試していないが、それがうまくいくとしても、私はむしろベンダーパッケージを編集したくない。

3

アセットのコンパイルはキャッシュシステムの一部ではありません。環境に関係なく、変更を加えるときに資産を再インストールする必要があります。

app/console assets:install web 

あなたがにしているファイルシステムがシンボリックリンクをサポートしている場合は、変更ごとにこのコマンドを実行する必要がなくなり、代わりにちょうどそのような

app/console assets:install web --symlink 

として資産をインストールしかし、あなたが使用しているので、することができますサス、これはおそらくあなたの選択肢ではありません。

HTH

+0

申し訳ありませんピーター、私ははっきりしていたはずです。私はアセットファイル(css、js)について、イメージのようなアセットではなく話しています。 docs(http://symfony.com/doc/current/cookbook/assetic/asset_management.html)では、開発環境ではこれらの資産が動的に処理され、変更は直ちに表示されるべきだと述べています。 – musoNic80

3

私は、これは古いトピックです知っているが、私は細かいことができる唯一の答えは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 */ 
13

devフォルダーでsymfony 2アセットを使用している場合は、環境を使用してください。this command

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

バージョン2以降です。4 --watch is deprecated、と置き換えられている:私は基本的に行われてから、任意の資産のキャッシュを停止し、私のparameters.yml、の最後に行を追加することによって、地域の発展にこの問題を修正した

php app/console assetic:watch 
+0

詳細:http://symfony.com/blog/new-in-symfony-2-6-smarter-assets-install-commandおよびhttp://symfony.com/doc/current/cookbook/assetic/asset_management.html – Dung

2

# parameters.yml 
... 

assetic.cache.class: Assetic\Cache\ArrayCache 

我々は、キャッシングが起こるしたいので、これは決しては、本番環境に含まれるべきです!

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

そして開発が終了したら削除します。 このようにして、キャッシュをクリアして設定を追加/変更する必要はありません。それはいつも私のために働く。

関連する問題