2012-07-10 23 views
12

के साथ रीफ्रेश नहीं कर रही है। मैं एसएसएसएस फ़ाइलों को पास और संकलित करने के लिए कंपास फ़िल्टर के साथ एसेटिक का उपयोग कर रहा हूं। सेटअप का यह हिस्सा ठीक काम करता प्रतीत होता है। हालांकि, मेरी समझ यह थी कि app_dev वातावरण में, सिम्फनी 2 प्रत्येक पृष्ठ लोड के लिए सभी संपत्तियों (सीएसएस सहित) को पुन: संकलित करेगा और कैशिंग सिस्टम का उपयोग नहीं करेगा जो यह प्रोड पर्यावरण के लिए नियोजित है।स्टेटिक संपत्ति symfony2 स्पष्ट कैश कमांड

ऐसा प्रतीत नहीं होता है।

जब मैं एक .scss में होने वाले बदलाव फ़ाइल यह केवल तभी प्रभावी होगी अगर मैं का उपयोग करें:

app/console cache:clear 

मैंने सोचा था कि देव पर्यावरण का पूरा उद्देश्य इस हर बार ऐसा करने के लिए होने से बचने के लिए किया गया था ?!

मैंने कैश फ़ोल्डरों की अनुमतियों की जांच की है (सुरक्षित होने के लिए मैंने उन्हें सेट किया है ताकि कोई भी पढ़ और लिख सके)। क्या किसी के पास कोई सुझाव है?

+0

मैं ** कम ** के साथ सिम्फनी का उपयोग करता हूं और यह प्रत्येक अनुरोध पर इसे पुन: संकलित करता है, जब तक कि वास्तविक वास्तविक फ़ाइल में परिवर्तन होते हैं और उस से आयात की गई फ़ाइलों में नहीं। शायद यह तुम्हारी समस्या है? – solarc

उत्तर

10

मुझे लगता है कि मैं इस सवाल का जवाब यहाँ मिल गया है:

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

ऐसा लगता है कि एक परिवर्तन मूल फ़ाइल तो माता-पिता में कोई भी परिवर्तन के बिना एक आयातित फाइल करने के लिए किया जाता है फाइल को दोबारा नहीं बदला जाएगा। नतीजा तब तक नहीं देखा जाएगा जब तक आप पुनर्मूल्यांकन को मजबूर नहीं करते।

Google समूहों पर पोस्टर ने एसेटिक कंट्रोलर को संपादित करके एक संभावित फिक्स (हैक!) का सुझाव दिया। मैंने अभी तक यह कोशिश नहीं की है, लेकिन अगर यह काम करता है तो भी मैं एक विक्रेता पैकेज संपादित नहीं करना चाहता हूं।

3

संपत्ति संकलन कैशिंग सिस्टम का हिस्सा नहीं है। पर्यावरण के बावजूद, जब आप परिवर्तन करते हैं तो आपको संपत्तियों को फिर से इंस्टॉल करने की आवश्यकता होती है।

app/console assets:install web 

फाइल सिस्टम पर हैं, उसके सांकेतिक लिंक का समर्थन करता है, तो आप प्रत्येक परिवर्तन के लिए इस आदेश को चलाने के लिए होने से बचने कर सकते हैं और इसके बजाय बस के रूप में इस तरह के

app/console assets:install web --symlink 

संपत्ति स्थापित लेकिन आप उपयोग कर रहे हैं के बाद से सास, यह शायद आपके लिए एक विकल्प नहीं है।

HTH

+0

क्षमा करें पीटर, मुझे स्पष्ट होना चाहिए था। मैं केवल संपत्ति फ़ाइलों (सीएसएस, जेएस) के बारे में बात कर रहा हूं छवियों की तरह संपत्ति नहीं। दस्तावेज़ों में (http://symfony.com/doc/current/cookbook/assetic/asset_management.html) यह बताता है कि देव पर्यावरण में इन संपत्तियों को गतिशील रूप से संभाला जाता है और परिवर्तन तुरंत देखा जाना चाहिए। – musoNic80

3

मुझे पता है कि यह एक पुराना विषय है, लेकिन एकमात्र उत्तर जो मैं ठीक कर सकता हूं, वह CompassElephantBundle और उपरोक्त 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

यदि आप देव में सिम्फनी 2 संपत्तियों के साथ काम कर रहे हैं। पर्यावरण, बस this command का उपयोग करें:

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

संस्करण 2 के बाद से।4 --watch is deprecated, और ने ले लिया है:

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, जो मूल रूप से हो रहा से किसी भी संपत्ति कैशिंग बंद हो जाता है के अंत में एक पंक्ति जोड़कर स्थानीय विकास में इस मुद्दे तय कर दी है।

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

और विकास समाप्त करने के बाद मैं उन्हें हटा देता हूं। इस तरह मुझे अपने कैश को साफ़ करने और किसी भी सेटिंग को जोड़ने/बदलने की आवश्यकता नहीं है। यह हमेशा मेरे लिए काम करता है।