2012-08-22 17 views
12

प्रत्येक बार पृष्ठ को फिर से लोड होने पर संपत्ति को प्रस्तुत करने के लिए मैं संपत्ति को कैसे मजबूर कर सकता हूं (इससे कोई फर्क नहीं पड़ता कि संपत्ति संशोधित है या नहीं)?प्रत्येक बार पृष्ठ को फिर से लोड होने पर संपत्तियों को प्रस्तुत करने के लिए मैं संपत्ति को कैसे मजबूर कर सकता हूं?

मेरी समस्या के बारे में अधिक विवरण:

मैं वर्तमान में एक Symfony2 परियोजना जहाँ मैं Assetic का उपयोग प्रबंधन और .less फ़ाइलों को संकलित करने पर काम कर रहा हूँ। मुझे सबकुछ ठीक काम करने के लिए मिला लेकिन मुझे एक छोटा सा मुद्दा है जिसे मैं ठीक करना चाहता हूं।

config.yml में, मैंने एसेटिक use_controller को सत्य पर सेट किया है।

# Assetic Configuration 
assetic: 
debug:   %kernel.debug% 
use_controller: true 

नतीजा यह है कि Symfony गतिशील नई .css फ़ाइलें हर बार .less फ़ाइलें संशोधित कर रहे हैं renders है। यह भी खूब रही।

मेरे समस्या है, मैं एक मुख्य project.less फ़ाइल जहाँ मैं अन्य सभी .less फ़ाइलों

// Import Twitter Bootstrap 
@import "../../../../../../vendor/twitter/bootstrap/less/bootstrap.less"; 

// Import Foo 
@import "foo.less"; 

... 

आयात यह मेरे लिए एक साफ संरचना रखने के लिए अनुमति देता है और यह भी विक्रेताओं से फ़ाइलें .less आयात करने के लिए उपयोग करते हैं वह यह है कि उदाहरण: ट्विटर बूटस्ट्रैप।

मेरे ट्विग टेम्पलेट में, मैं केवल यह मुख्य फ़ाइल कॉल करता हूं।

{% stylesheets '@ProjectWebBundle/Resources/public/less/project.less' filter='less' %} 
     <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" /> 
{% endstylesheets %}  

चूंकि यह मुख्य .less फ़ाइल कभी संशोधित नहीं होती है, इसलिए एसेटिक संपत्तियों को पुन: संकलित नहीं करता है। यही कारण है कि मैं इसे फाइलों को प्रस्तुत करना चाहता हूं इससे कोई फर्क नहीं पड़ता कि उन्हें संशोधित किया गया है या नहीं।

+0

कोशिश '{% स्टाइलशीट '@ ProjectWebBundle/संसाधन/सार्वजनिक/कम/project.less' फिल्टर = 'कम' डिबग = सच%}' – Florent

+0

अपने त्वरित जवाब @Florent के लिए धन्यवाद, लेकिन यह समाधान नहीं करता है समस्या। – Evarouss

उत्तर

0

आपको use_controller: false पर जाना चाहिए और को अपना संशोधन पूरा करने के बाद अपनी संपत्तियों को संकलित करना चाहिए।

आप अपनी संपत्ति संकलित करने के लिए करना चाहते हैं:

php app/console assetic:dump 
+2

यह काम करता है। हालांकि इसका मतलब है कि हर बार जब मैं एक फ़ाइल को संशोधित करता हूं, तो मुझे उस आदेश को निष्पादित करना होगा। यह एक दर्द है। यदि मैं आदेश में एक --watch पैरामीटर जोड़ता हूं तो मेरे ऊपर वर्णित वही समस्या है। – Evarouss

3

मैं a simple script बना लिया है इस समस्या को हल करने के लिए। कृपया इसे आज़माएं और अगर मदद मिली तो मुझे बताएं।

#!/bin/bash 

# assetic-watch: A very simple shell-script to recursively and efficiently 
# watch for asset changes and to trigger automatic recompilation. 
# 
# By Slava Fomin II <[email protected]> 
# Feel free to contact me. 
# From Russia with Love. 
# Let's make this World a Better place! 
# -------------------------------------- 

#===============# 
# CONFIGURATION # 
#===============# 

# Path relative to "Symfony/src" directory. 
# File changes under specified directory will trigger recompilation 
# of all assets. 
WATCH_PATH="Name/Bundle/NameBundle/Resources/public/css" 

# Environment. 
ENV="dev" 

# Additional options for "app/console". 
OPTS="" 

# inotifywait events to watch for. 
INW_EVENTS="close_write,moved_to,create" 

# Optional inotifywait arguments. 
INW_OPTS="" 

# Relative path to the Symfony root directory. 
SYMFONY_PATH="../" 

#============# 
# PROCESSING # 
#============# 

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 
CONSOLE_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/app/console" 
SRC_PATH="$SCRIPT_DIR/${SYMFONY_PATH}/src/$WATCH_PATH" 

quietly() { "[email protected]" > /dev/null 2>&1; } 

while true; do 
    quietly inotifywait --recursive -e $INW_EVENTS $INW_OPTS $SRC_PATH 
    php $CONSOLE_PATH assetic:dump --env=$ENV $OPTS 
done 

मुझे उम्मीद है कि सिम्फनी डेवलपर्स एसेटिक बंडल के भविष्य के संस्करणों में इस मुद्दे को संबोधित करेंगे। मेरा मानना ​​है कि यह एक गंभीर सीमा है।

+0

मैं आपको धन्यवाद नहीं दे सकता। पिछली बार मैंने कोशिश की, यह मेरे लिए काम नहीं कर रहा था, लेकिन अब मेरे env। थोड़ा अलग है। यह केवल एकमात्र समाधान है जो लाइव.जे.एस. का उपयोग करके @ आयातित सीएसएस को ऑटोरेफ्रेश करने के लिए काम करता है। बहुत बहुत धन्यवाद! मैंने समाधान की तलाश में बहुत अधिक समय बिताया है, और मैंने सोचा कि मैं आपको वापस सर्कल कर दूंगा, क्योंकि मैं आपकी स्क्रिप्ट चट्टानों को जानता हूं। यह अंततः भुगतान किया गया :-) – blamb

+0

ओह, धन्यवाद @ ब्रियन थॉमस, मेरी मदद करने में खुशी =) मैं अब खुद को संपत्ति का उपयोग नहीं कर रहा हूं, मैंने ग्रंट पर स्विच किया और अब मेरी सभी स्क्रिप्ट को संकलित करने के लिए गुलप पर स्विच किया। यह संपत्तियों का प्रबंधन करने के लिए एक बहुत ही लचीला और शक्तिशाली तरीका है। आप इसके साथ लाइवरेलोड का भी उपयोग कर सकते हैं। –

+0

मैं मानता हूं, यह करना एक बहुत ही उचित बात है। कृपया, मेरे उत्तर को संपादित करने और कोड नमूना जोड़ने के लिए स्वतंत्र महसूस करें। –

10

इस के लिए कोई सही समाधान है AFAIK अभी तक

मैं का उपयोग करें:

php app/console assetic:dump --watch 

जो आपके .less संकलन होगा हर बार उस पर संदर्भित .less फ़ाइलों में से किसी में एक परिवर्तन का पता लगाता फ़ाइलें आपके टेम्पलेट्स

बल एक संकलन आपको अपनी "मुख्य" फ़ाइल में कोई बदलाव करना है (फ़ाइल जो दूसरों को आयात करती है)। लेकिन, अच्छी खबर यह है कि ऐसा करने के लिए फ़ाइल को "स्पर्श" करने के लिए पर्याप्त है।तो आप बस इसे मैन्युअल रूप से हर बार स्पर्श कर सकते हैं आप की जरूरत:

touch ~/web/css/main.less; 

या, क्या मैं आमतौर पर एक स्क्रिप्ट को छू लेती है कि इस "मुख्य" प्रत्येक 60 सेकंड या तो फ़ाइल स्थापित करने के लिए है:

while true; do 
    sleep 60 
    touch ~/web/css/main.less 
done 

यह लिनक्स और मैक पर काम करना चाहिए।

उम्मीद है कि यह मदद करता है। कम से कम अस्थायी रूप से :)

11

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

<?php 

namespace Xxx\AssetsBundle\Assetic\Filter; 

use Assetic\Asset\AssetInterface; 
use Assetic\Filter\LessphpFilter; 

class LessphpNonCachedFilter extends LessphpFilter 
{ 
    public function filterLoad(AssetInterface $asset) 
    { 
     $root = $asset->getSourceRoot(); 
     $path = $asset->getSourcePath(); 

     $filename = realpath($root . '/' . $path); 

     if (file_exists($filename)) { 
      touch($filename); 
     } 

     parent::filterLoad($asset); 
    } 
} 

और तुम "assetic.filter.lessphp.class" अपने मानकों को धारा (services.yml) में सेट करना होगा के साथ डिफ़ॉल्ट Assetic के फिल्टर हर फ़ाइल प्रदान करता है और छू लेती बना लिया है:

parameters: 
    assetic.filter.lessphp.class: Xxx\AssetsBundle\Assetic\Filter\LessphpNonCachedFilter 
+0

नोट: स्पर्श लिखने की अनुमति की आवश्यकता है। आपको यह सुनिश्चित करना होगा कि आपकी 'project.less' फ़ाइल में xx6 अनुमतियां सेट हैं। (मैंने अपना 0666 पर सेट किया है।) – Kevin

+0

मेरे लिए काम नहीं करें (सिम्फनी 2.1.2) – timaschew

+0

मैं 'नोड' के माध्यम से 'LESS' का उपयोग कर रहा हूं,' स्पर्श 'सिद्धांत वही रहता है,' फ़ाइल को स्पर्श करें '(उदाहरण: बूटस्ट्रैप.लेस) 'आपके कंट्रोलर में' __construct() '- यह प्रत्येक पृष्ठ लोड को पुन: संकलित करने के लिए मजबूर करेगा – Anil