2009-05-21 13 views
8

मुझे यह जानने में दिलचस्पी होगी कि लोग सशर्त मार्कअप को कैसे संभालते हैं, खासकर रिलीज और डीबग बिल्ड के बीच उनके मास्टरपेज में।जेएस/सीएसएस में सेक्शन प्रतिस्थापन, डीबग बनाम रिलीज

यह विशेष परिदृश्य है जो संगत जेएस और सीएसएस फ़ाइलों को संभालने के लिए लागू होता है। मैं वर्तमान में अलग फ़ाइलों के एक बड़े संग्रह से एक साइट.css और site.js का उत्पादन करने के लिए YUI संपीड़न के .NET पोर्ट का उपयोग कर रहा हूं।

एक विचार है कि मेरे पास आ गई जगह js और सीएसएस एक उपयोगकर्ता नियंत्रण या पैनल के संग्रह में खंड शामिल हैं और सशर्त <link> और <script> मार्कअप डीबग के आधार पर प्रदर्शित करने या विधानसभा के राज्य रिलीज किया गया था। की तर्ज पर कुछ:

#if DEBUG 
    pnlDebugIncludes.visible = true 
#else 
    pnlReleaseIncludes.visible = true  
#endif 

पैनल वास्तव में बहुत अच्छा है शब्दार्थ नहीं है - एक <div> में <script> टैग लपेटकर एक सा सकल है, एक बेहतर दृष्टिकोण होना चाहिए। मुझे यह भी लगता है कि जैसे <head> के भीतर एक ब्लॉक स्तर तत्व अमान्य HTML होगा।

एक और विचार यह संभवतः वेब.कॉन्फिग सेक्शन प्रतिस्थापन का उपयोग करके संभाला जा सकता था, लेकिन मुझे यकीन नहीं है कि मैं ऐसा करने के बारे में कैसे जाऊंगा।

+0

वाईयूआई संपीड़न का नेट पोर्ट - धन्यवाद, मैं अपनी जेएस फाइलों को संयोजित करने के लिए ऐसा कुछ ढूंढ रहा हूं। –

+0

ओएमजी - मुझे वह आदमी पता है जिसने यूयूआई के .NET पोर्ट को किया था। छोटी दुनिया, आदि .. –

उत्तर

5

वहाँ web.config सेटिंग्स यहाँ में बदलाव पर एक सभ्य चर्चा है Using different Web.config in development and production environment

नोट: आप एक अलग सवाल पूछ रहे हैं, लेकिन मैं सुझाव देता हूं कि वैसे भी इसे देखें क्योंकि यह लाइव और डीबग सेटिंग्स के बीच स्विच करने के सुझावों का एक अद्भुत संग्रह है और सभी उत्तरों (आईएमओ) के पास कुछ मूल्य है - नहीं सिर्फ उच्चतम मतदान/स्वीकृत उत्तर।

निजी तौर पर, मैं एक विधि यहाँ समझाया और लगता है कि यह सबसे लचीला है और के रूप में यह फ़ाइल आधारित है विन्यास बदलाव के सभी प्रकार के लिए लागू है, लेकिन उन्हें समाधान विन्यास के आधार पर स्वत: बदली होने की अनुमति देता का उपयोग करें:

http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

अनिवार्य रूप से, आप समाधान विन्यास फ़ाइल नाम के साथ जोड़ दिया नाम के साथ डिस्क पर एक दूसरे के साथ वेब config बाहर स्वैप करने के लिए एक पूर्व निर्माण घटना चलाते हैं। उदाहरण के लिए, मेरे पास web.config.release, web.config.debug और यहां तक ​​कि एक web.config.neilathome है।

मैं आंशिक कक्षाएं बनाकर कोड की सशर्त बिट्स के लिए सटीक वही विधियों का उपयोग करता हूं और अपनी स्वयं की फ़ाइलों में मेरे समाधान कॉन्फ़िगरेशन के बीच बदलती सामग्री डालता हूं। उदाहरण के लिए, मेरे पास sync_timersettings.cs है जो आंशिक कक्षा है जिसमें कुछ स्थिरांक हैं जो परिभाषित करते हैं कि मेरा अपडेट कोड कितनी बार वेब-सेवा कॉल करता है। या आप बस अपनी सभी सेटिंग्स को app.settings फ़ाइल में डाल सकते हैं और इसे इस तरह से कर सकते हैं।

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

आगे ध्यान दें: टिप्पणी करने के लिए

#if DEBUG 
    pnlDebugIncludes.visible = true 
#else 
    pnlReleaseIncludes.visible = true  
#endif 

जवाब:

यह केवल उपयोगी है यदि आप एक डिबग समाधान विन्यास और एक दूसरे जो अपनी लाइव तैनाती है है। यह तब काम नहीं करेगा जब आप (मेरे जैसे) एक स्टेजिंग, रिलीज और नेइलोनिस्प्लेप्ट समाधान कॉन्फ़िगरेशन करते हैं क्योंकि DEBUG प्रतीक केवल तभी सेट होता है जब आपके पास डिबगिंग सक्षम हो। कार्य-आसपास अपने वेब एप्लिकेशन के गुण पृष्ठ पर जाना है और बिल्ड टैब में, अपनी प्रत्येक बिल्ड कॉन्फ़िगरेशन के लिए एक सशर्त प्रतीक डालें। आईई, सेट करने के लिए कॉन्फ़िगरेशन बनाने और उस टैब में सशर्त प्रतीक बॉक्स में 'रिलीज़' डालने के लिए सेट करें। फिर विभिन्न बिल्ड कॉन्फ़िगरेशन के लिए ऐसा ही करें, वहां सशर्त प्रतीक बॉक्स स्वचालित रूप से आपके निर्माण कॉन्फ़िगरेशन के आधार पर बदल जाएगा। #if सशर्त संकलन निर्देश तब अपेक्षित काम करेंगे।

बायर्ड ने कॉन्फ़िगरेशन के बीच मार्क-अप बदलने के लिए इसका उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए कहा। ठीक है आप पूरे .aspx पृष्ठ को स्वैप करने के लिए उपयोग कर सकते हैं - home.aspx.release और home.aspx.debug है लेकिन इसका मतलब यह होगा कि आपको प्रत्येक फ़ाइल में बहुत सारे मार्क-अप को दोहराना होगा। मेरा समाधान मेरे आवेदन में आंशिक वर्ग जोड़ना है। उदाहरण के लिए, मेरे 'ViewImage' पृष्ठ उस में निम्नलिखित वर्ग परिभाषा है:

public partial class ViewImage : System.Web.UI.Page 

..so मैं एक ही हस्ताक्षर के साथ कुछ वर्ग फ़ाइलों बनाया है और उन्हें 'ViewImage_titleset.cs.debug' और 'ViewImage_titleset.cs नामित .staging ':

namespace Website 
{ 
    public partial class ViewImage : System.Web.UI.Page 
    { 
     public void SetTitle() 
     { 
      Page.Title = "Running in debug mode"; 
     } 
    } 
} 

और

namespace Website 
{ 
    public partial class ViewImage : System.Web.UI.Page 
    { 
     public void SetTitle() 
     { 
      Page.Title = "Running in staging mode"; 
     } 
    } 
} 

ViewImage के लिए पृष्ठ लोड घटना में setTitle ..calling जो निर्माण विन्यास स्थान पर था पर निर्भर करता है शीर्षक बदल जाएगा। यह केवल तभी काम करेगा यदि आप प्रोग्राम को प्रोग्रामेटिक रूप से बदल रहे हैं।

इस तरह के कोड को बदलने के लिए उपरोक्त सशर्त संकलन विधि का उपयोग करना बेहतर है और गैर-कोड फ़ाइलों जैसे छवियों या web.configs को बदलने के लिए फ़ाइल-स्वैप विधि को आरक्षित करना बेहतर है। बस सुनिश्चित करें कि आप प्रकाशित करने के लिए वैकल्पिक फ़ाइलों को तैनात नहीं करते हैं।

+1

मैं विकास, परीक्षण और उत्पादन समाधान विन्यास का भी उपयोग करता हूं। #if विकास pnlDevelopmentIncludes.visible = सच #endif #if टेस्ट pnlTestIncludes.visible = सच #: जब तक आप प्रत्येक विन्यास के लिए एक सशर्त संकलन प्रतीक परिभाषित करते हैं, तो आप इस तरह कुछ करने के लिए सक्षम होना चाहिए endif –

+0

नील यह निश्चित रूप से लेने के लिए सही दृष्टिकोण की तरह लगता है।क्या आप अलग-अलग बिल्डों के बीच अपना मार्कअप बदलने के लिए आंशिक कक्षाओं का उपयोग कैसे कर रहे हैं, इस पर विस्तार कर सकते हैं? –

+0

आप अपना नामकरण सम्मेलन web.debub.config या web.release.config जैसे अधिक होने के लिए बदल सकते हैं। डिफ़ॉल्ट रूप से IIS .config में समाप्त होने वाली फ़ाइलों की सेवा नहीं करेगा, इसलिए यह बेहतर हो सकता है। –

9

मैंने अभी अपने एएसपी.नेट एमवीसी प्रोजेक्ट में अपने मास्टर पेज में यह कोशिश की और यह काम किया। डिबग मोड में मैं jQuery के विकास के संस्करण का उपयोग करें और नहीं डिबग मोड में, मैं jQuery के minified संस्करण का उपयोग करते हैं, तो:

:

<head runat="server"> 
<% #if DEBUG %> 
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.js") %>"></script> 
<% #else %> 
    <script type="text/javascript" src="<%= Url.Content("~/Scripts/jquery.min.js") %>"></script> 
<% #endif %> 
</head> 
+0

ऐसा लगता है कि यह संपादक में ठीक तरह से काम नहीं करता है (जैसे कोड में जहां भाग प्रभाव में नहीं है) लेकिन यह काम करता है। – Will

+1

ध्यान दें कि DEBUG प्रतीक को web.config के ' Sprintstar

1

जेएस फाइलों के संबंध में मैं जो करता हूं वह वेब ऐप को पूर्व-संकलित करने के लिए Web Deployment Projects का उपयोग करता है। कॉन्फ़िगरेशन रिलीज़ होने पर निर्माण पूर्ण होने के बाद, मैं जेएस फ़ाइलों को छोटा करता हूं और आउटपुट निर्देशिका में फ़ाइलों को प्रतिस्थापित करता हूं। यह सब MSBuild के साथ किया गया है, बीक्यूज वेब परिनियोजन परियोजनाएं MSBuild फ़ाइलें हैं।

संबंधित मुद्दे