2010-04-29 17 views
27

AS3 में आप संकलकफ़्लैश/फ्लेक्स सशर्त संकलन "और"

-define+=CONFIG::DEBUG,true 

को एक निरंतर पारित और इसलिए तरह सशर्त संकलन के लिए उपयोग कर सकते हैं:

CONFIG::DEBUG { 
    trace("This only gets compiled when debug is true."); 
} 

मैं कुछ के लिए देख रहा हूँ #ifndef की तरह, इसलिए मैं डीबग के मान को अस्वीकार कर सकता हूं और इसे सशर्त रूप से रिलीज कोड जोड़ने के लिए उपयोग कर सकता हूं। एडोब में conditional compilation documentation में अब तक का एकमात्र समाधान मिला है और चूंकि मेरी डीबग और रिलीज कॉन्फ़िगरेशन पारस्परिक रूप से अनन्य हैं, इसलिए मुझे डेबग और रिलीज स्थिरांक दोनों के विचार पसंद नहीं हैं।

इसके अलावा, इस प्रारूप में काम करता है, लेकिन मैं इसे रनटाइम पर जांच चल रहा है जो नहीं है जो मैं चाहता संभालने हूँ:

if (CONFIG::DEBUG) { 
    //debug stuff 
} 
else { 
    //release stuff 
} 

मैं भी कुछ इस तरह कर रही है माना लेकिन यह अभी भी सुरुचिपूर्ण समाधान नहीं है मैं के लिए उम्मीद की गई थी:

-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG 

अग्रिम :) धन्यवाद

उत्तर

8

if/else निर्माण का उपयोग करें: मृत कोड हो जाएगा संकलक द्वारा हटाया गया और इसे रनटाइम पर परीक्षण नहीं किया जाएगा। आपके एसएफएफ में आपके कोड का केवल एक संस्करण होगा।

यदि आप निश्चित रूप से एक डिकंपेलर या डंप टूल का उपयोग नहीं करते हैं तो यह देखने के लिए कि वास्तव में क्या होता है।

http://apparat.googlecode.com/files/dump.zip

http://www.swftools.org/

...

+1

उचित लगता है। दूसरी तरफ, फ्लैश/फ्लेक्स कंपाइलर _astoundingly stupid_ हो सकता है, जैसा कि आप कहते हैं, मैं इसका उपयोग करने से पहले जांच करूँगा यदि प्रदर्शन वास्तव में आपके लिए मायने रखता है। – aaaidan

+3

-1। * If/else * निर्माण काम नहीं करता है .. इसे साबित करने के लिए सरल परीक्षण: [एम्बेड करें] ऐसे में एक भारी फ़ाइल अगर/अन्य ब्लॉक। अगर आउटपुट फाइलसाइज तदनुसार बदलता है तो यह काम करता है, अन्यथा यह नहीं करता है। ऐसे में अगर कोई/अन्य ब्लॉक सिंटैक्स त्रुटियों का उत्पादन करता है जब किसी फ़ंक्शन के बाहर उपयोग किया जाता है जो निष्कर्ष निकालता है कि कोड ब्लॉक छीन नहीं जाएगा! – bummzack

+0

हां, मुझे लगता है कि यह तकनीक ऑप्टिमाइज़र के दुष्प्रभाव पर बहुत अधिक निर्भर करती है। सशर्त संकलन बहुत बेहतर है। अगर आपको #ifndef की तरह कुछ चाहिए, तो नीचे मेरा जवाब देखें। –

22

यह ठीक काम करता है और कहा कि नहीं चलेंगे कोड नहीं हटेगा:

if (CONFIG::DEBUG) { 
    //debug stuff 
} 
else { 
    //release stuff 
} 

लेकिन इस पर मूल्यांकन किया जाएगा रनटाइम:

if (!CONFIG::DEBUG) { 
    //release stuff 
} 
else { 
    //debug stuff 
} 

एमएक्सएमएलसी स्पष्ट रूप से केवल एक शाब्दिक बूलियन का मूल्यांकन कर सकता है, और किसी भी प्रकार की अभिव्यक्ति नहीं, जिसमें एक सरल शामिल नहीं है।

+0

क्या आप एक दस्तावेज़ीकरण उद्धृत कर सकते हैं? –

+1

यह सही उत्तर होना चाहिए ... – Pier

4

जबकि पैट्रिक का जवाब प्रश्न के मानदंडों को पूरा करता है, इसमें सभी उपयोग मामलों को शामिल नहीं किया जाता है। यदि आप कोड के क्षेत्र में हैं जो आपको if/else कथन का उपयोग करने की अनुमति देता है तो यह एक अच्छा जवाब है। लेकिन अगर आप ऐसे स्थान पर हैं जहां आप नहीं कर सकते हैं तो आपको बेहतर समाधान की आवश्यकता होगी। उदाहरण के लिए, यदि आप एक कक्षा में एक निरंतर घोषित करने के लिए कुछ इस तरह करना चाहते हैं हो सकता है:

private var server:String = "http://localhost/mystagingenvironment"; 

या एक जीवित रिहाई के लिए:

private var server:String = "http://productionserver.com"; 

(यह एक उदाहरण है और मैं वकालत नहीं कर रहा हूँ यह उत्पादन कोड के रूप में)।

मैं xml कॉन्फ़िगर का उपयोग करता हूं और लोड कॉन्फिग + = "myconfig.xml" का उपयोग करता हूं ताकि बड़ी संख्या में कमांड लाइन पैराम पास करने के बजाय मेरी कॉन्फ़िगरेशन कर सकें।तो अपने xml config की <compiler> खंड में:

<define> 
    <name>CONFIG::debug</name> 
    <value>false</value> 
    </define> 
<define> 
    <name>CONFIG::release</name> 
    <value>!CONFIG::debug</value> 
</define> 

यह सब उपयोग के मामलों के लिए अच्छी तरह से काम करता है:

CONFIG::debug 
{ 
    private var server:String = "http://localhost/mystagingenvironment"; 
} 
CONFIG::release 
{ 
    private var server:String = "http://productionserver.com"; 
} 

इस आवेदन पत्र में समान रूप से काम करने के अतिरिक्त लाभ है। यह 'ऑप्टिमाइज़' ध्वज पर भी भरोसा नहीं करता है, जैसे पैट्रिक का जवाब (हालांकि मुझे लगता है कि हम मान सकते हैं कि 99.9 99 999% सभी एसएफएफ के अनुकूलन = सही हैं, मैं ऑप्टिमाइज़र को अपने एएस 3 को तोड़ने पर ही इसे झूठा कर देता हूं)।

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

+0

यह सबसे सुरुचिपूर्ण समाधान की तरह लगता है। कम संकलक पैरामीटर, और एक बाहरी एक्सएमएल फ़ाइल में एक अच्छा अलगाव। इसे काम करने के लिए, XML फ़ाइल में एक अतिरिक्त "flex-config" रूट तत्व होना चाहिए, जैसा कि यहां देखा गया है: http://help.adobe.com/en_US/air/build/WSfffb011ac560372f2012b5a4128cca83a39-8000.html। मैंने यह भी पाया: http://www.flashdevelop.org/community/viewtopic.php?f=13&t=9696 जो 'append = true' विशेषता का उपयोग करता है। मैंने यह सब करने की कोशिश की है, लेकिन फिर भी मेरा एप्लिकेशन xml तर्कों के बिना किए गए तरीके से काम नहीं करता है। हालांकि यह संकलित करता है। किसी को भी ऐसी ही समस्याएं हैं? –

+0

मैं अपनी पिछली टिप्पणी को संपादित नहीं कर सकता, लेकिन: दोष को फिर से पढ़ने के बाद, यह समझ में आता है। मैं पुस्तकालय परियोजना सहित, मेरे प्रोजेक्ट के लिए अतिरिक्त स्रोत पथ का उपयोग कर रहा हूं। जोड़ने के लिए: न केवल रिलीज बिल्ड तोड़ देंगे। नियमित डीबग भी बनाता है :(जो वास्तव में खराब है, क्योंकि यह सशर्त संकलन के लिए एक अच्छा और साफ तरीका है। आह ठीक है, जल्दी और गंदे और काम करने के लिए। –

+0

आपको यह सुनकर खेद है कि आपको समस्याएं हैं। मुझे शुभकामनाएं मिली हैं एक्सएमएल फाइलों के साथ और वे वास्तव में वास्तव में अच्छे हैं, जब आप वास्तव में बड़ी परियोजनाओं पर काम कर रहे हैं, कहें, 5 विकास वातावरण! यहां एक उदाहरण फ्लेक्स कॉन्फ़िगर xml है जिसका उपयोग मैंने एक छोटे प्रोटोटाइप के लिए किया था। यह मेरे जैसा ही है एक बड़े पैमाने पर प्रोजेक्ट पर उपयोग करेगा: http://enemyhideout.com/example_flex_configs/game-flex-config.xml –

0

क्रिस हिल के उत्तर के बारे में बस मेरे दो सेंट (जो समाधान मैं नियमित रूप से भी उपयोग करता हूं): ऐसा लगता है कि loadConfig + = "myconfig.xml" विकल्प का उपयोग कर संकलक को myconfig.xml फ़ाइल को फ्लेक्स एसडीके में खोजता है निर्देशिका जबकि -load-config + = myconfig.xml विकल्प यह प्रोजेक्ट की निर्देशिका में myconfig.xml फ़ाइल को खोजता है, जो व्यवहार मैं दृढ़ता से पसंद करता हूं क्योंकि आप आसानी से इस फ़ाइल को अपने प्रोजेक्ट स्रोतों के साथ वितरित कर सकते हैं ...

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