2010-04-29 76 views
27

在AS3中,你可以通過一個常數,編譯器的Flash/Flex的條件編譯「其他」

-define+=CONFIG::DEBUG,true 

,並使用它條件編譯像這樣:

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

我在尋找的東西像#ifndef,所以我可以否定調試的價值,並使用它來有條件地添加發布代碼。我迄今發現的唯一解決方案是在adobe的conditional compilation documentation中,因爲我的調試和發佈配置是互斥的,所以我不喜歡同時使用DEBUG和RELEASE常量的想法。

而且,這種格式的作品,但我假設它的運行檢查在運行時是不是我想要的:

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

我也算是做這樣的事情,但它仍然不是完美的解決方案我希望的:提前:)

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

感謝

回答

8

使用if/else構建體:死代碼會由編譯器刪除,它不會在運行時測試。您的swf中只有一個版本的代碼。

如果您不確定使用反編譯器或轉儲工具來查看確實發生了什麼。

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

http://www.swftools.org/

...

+1

似乎合理。另一方面,Flash/Flex編譯器可能會很愚蠢,因爲如你所說,如果性能真的對你很重要,我會在使用之前檢查它。 – aaaidan

+3

-1。 * if/else *構造不起作用。簡單的測試來證明它:[嵌入]在這樣一個if/else塊中的沉重文件。如果輸出文件大小相應地改變,那麼它可以工作,否則它不會。此外,這樣的if/else塊在函數外部使用時會產生語法錯誤,從而導致代碼塊不會被剝離! – bummzack

+0

是的,我認爲這種技術太依賴於優化器的副作用。條件編譯好得多。如果您需要#ifndef之類的東西,請參閱下面的答案。 –

22

這工作得很好,並會去掉,將不會運行的代碼:

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

這將在評估運行時間:

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

mxmlc顯然只能評估一個文字布爾值,而不是任何一種表達式,包括一個簡單的而不是

+0

你能引用一個文檔嗎? –

+1

這應該是正確的答案... – Pier

4

雖然帕特里克的答案符合問題的標準,但並未涵蓋所有用例。如果您處於允許您使用if/else語句的代碼區域,那麼這是一個很好的答案。但是如果你在一個你不能的地方,那麼你需要一個更好的解決方案。例如,您可能希望做這樣的事情來聲明一個常量的一類:

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

或現場發佈:

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

(這是一個例子,我不主張這作爲生產代碼)。

我使用xml configs並使用loadConfig + =「myconfig.xml」來完成配置,而不是傳遞大量的命令行參數。因此,在您的XML配置的<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.999999%的所有swf都有優化= true,我只在優化器打破我的AS3時纔將它設置爲false)。

它的缺點是不會編譯所有代碼路徑,只是包含的代碼路徑。因此,如果您不使用構建服務器來創建發佈版本,並告訴您什麼時候發生故障,那麼當您進行發佈構建時,請準備好發現意外錯誤(「但是它在debug!Crap中編譯,我現在需要這個版本!」)。 )。

+0

這似乎是最優雅的解決方案。更少的編譯器參數以及外部XML文件中的良好分離。 爲了實現這個目標,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

我似乎無法編輯我之前的評論,但是:在重新閱讀缺點之後,這是有道理的。我正在爲我的項目使用aditional源代碼路徑,其中包括一個庫項目。要添加:不僅發佈版本會崩潰。還有定期的調試版本:(這一切都是非常糟糕的,因爲這是一個很好的,乾淨的方式來進行條件編譯。嗯,快速和骯髒的工作然後 –

+0

對不起,聽到你有問題。使用XML文件,當你使用5種開發環境來開發真正的大型項目時,他們真的非常棒!這裏有一個flex config xml示例,我用它作爲一個小原型,這與我的很相似將在一個大型的項目上使用:http://enemyhideout.com/example_flex_configs/game-flex-config.xml –

0

關於Chris Hill的回答(這是我經常使用的解決方案),我的兩分錢似乎是使用loadConfig + =「myconfig.xml」選項使編譯器搜索Flex SDK中的myconfig.xml文件目錄,而-load-config + = myconfig.xml選項使得它搜索項目目錄中的myconfig.xml文件,這是我非常喜歡的行爲,因爲您可以輕鬆地將該文件與您的項目源一起分發...