2012-07-10 37 views
12

Tôi đang sử dụng Assetic với bộ lọc la bàn để chuyển và biên dịch tệp .scss. Phần này của thiết lập dường như hoạt động tốt. Tuy nhiên, sự hiểu biết của tôi là trong môi trường app_dev, Symfony 2 sẽ biên dịch lại tất cả các tài sản (bao gồm css) cho mỗi lần tải trang và không sử dụng hệ thống bộ nhớ đệm mà nó sử dụng cho môi trường sản xuất.Nội dung tĩnh không làm mới với symfony2 lệnh bộ nhớ cache rõ ràng

Điều này có vẻ không xảy ra.

Khi tôi thực hiện một sự thay đổi đến một .scss nộp nó sẽ chỉ có hiệu lực nếu tôi sử dụng:

app/console cache:clear 

Tôi nghĩ toàn bộ các điểm môi trường dev là để tránh phải làm điều này mỗi lần ?!

Tôi đã kiểm tra quyền của các thư mục bộ nhớ cache (để an toàn, tôi đã đặt chúng để mọi người có thể đọc và viết). Không ai có bất cứ đề nghị?

+0

Tôi sử dụng Symfony với ** less ** và nó biên dịch lại theo yêu cầu, miễn là các thay đổi nằm trong tệp được bao gồm thực tế chứ không phải trong các tệp được nhập từ tệp đó. Có lẽ đó là vấn đề của bạn? – solarc

Trả lời

10

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời ở đây:

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

Có vẻ như rằng nếu thay đổi được thực hiện cho một tập tin nhập khẩu mà không cần bất kỳ thay đổi đối với tệp gốc sau đó phụ huynh tệp sẽ không được biên dịch lại. Kết quả là sự thay đổi sẽ không được nhìn thấy cho đến khi bạn buộc biên dịch lại.

Áp phích trên nhóm google đề xuất sửa lỗi có thể (hack!) Bằng cách chỉnh sửa AsseticController. Tôi chưa thử nó, nhưng ngay cả khi nó hoạt động tôi không muốn chỉnh sửa một gói nhà cung cấp.

3

Biên dịch tài sản không phải là một phần của hệ thống lưu vào bộ nhớ cache. Bạn cần phải cài đặt lại nội dung khi bạn thực hiện thay đổi, bất kể môi trường.

app/console assets:install web 

Nếu hệ thống tập tin bạn đang ở trên hỗ trợ liên kết tượng trưng, ​​bạn có thể tránh được việc phải chạy lệnh này cho mọi sự thay đổi và thay vào đó chỉ cần cài đặt các tài sản như vậy

app/console assets:install web --symlink 

Nhưng kể từ khi bạn đang sử dụng Sass, điều này có lẽ không phải là một lựa chọn cho bạn.

HTH

+0

Xin lỗi Peter, tôi nên rõ ràng hơn. Tôi chỉ nói về tập tin tài sản (css, js) không phải tài sản như hình ảnh. Trong các tài liệu (http://symfony.com/doc/current/cookbook/assetic/asset_management.html) nó nói rằng trong môi trường dev các tài sản này được xử lý động và các thay đổi sẽ được nhìn thấy ngay lập tức. – musoNic80

3

Tôi biết đây là một chủ đề cũ nhưng câu trả lời duy nhất tôi có thể sử dụng là CompassElephantBundle và AsseticController ở trên. Tôi đã có một cách tiếp cận mà về cơ bản nhưng có nghĩa là tôi không phải chỉnh sửa gói nhà cung cấp.

Cách tôi đã thực hiện nó là chỉnh sửa sao chép bản gốc AsseticController và sau đó liên kết với điều đó trong cấu hình từ các tham số.

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

AsseticController được sao chép chỉ thực hiện preg_match cho loại tệp từ đường dẫn nguồn và sửa bộ nhớ đệm từ đó.

<?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

nếu bạn đang làm việc với symfony 2 nội dung trong dev. môi trường, chỉ cần sử dụng this command:

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

Kể từ phiên bản 2.4 --watch is deprecated, và đã được thay thế bởi:

php app/console assetic:watch 
+0

chi tiết: http://symfony.com/blog/new-in-symfony-2-6-smarter-assets-install-command và http://symfony.com/doc/current/cookbook/assetic/asset_management.html – Dung

2

Tôi đã cố định vấn đề này trong phát triển địa phương bằng cách thêm một dòng vào cuối parameters.yml của tôi, mà ngay lập tức ngừng bất kỳ bộ nhớ đệm tài sản từ xảy ra.

# parameters.yml 
... 

assetic.cache.class: Assetic\Cache\ArrayCache 

này bao giờ nên được bao gồm trong một môi trường sản xuất như chúng tôi muốn bộ nhớ đệm xảy ra!

0

Tôi sử dụng cách khác. Tôi đang thêm tất cả các tệp .scss trong quá trình phát triển

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

và sau khi hoàn thành phát triển, tôi xóa chúng. Bằng cách này, tôi không cần xóa bộ nhớ cache của mình và thêm/thay đổi bất kỳ cài đặt nào. Nó luôn làm việc cho tôi.