2010-04-29 7 views
27

w AS3 można przekazać stałe do kompilatoraFlash/Flex warunkowa kompilacja "else"

-define+=CONFIG::DEBUG,true 

i użyć go do kompilacji warunkowej tak:

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

szukam czegoś jak #ifndef, więc mogę zanegować wartość debugowania i użyć go do warunkowego dodania kodu zwolnienia. Jedyne rozwiązanie, jakie znalazłem do tej pory, było w wersji w Adobe i ponieważ moje konfiguracje debugowania i wydania wzajemnie się wykluczają, nie podoba mi się pomysł posiadania stałych DEBUG i RELEASE.

Ponadto format ten działa, ale jestem przy założeniu, że to działa sprawdzanie w czasie wykonywania których nie jest to, co chcę:

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

ja również rozważyć robi coś takiego, ale wciąż nie jest eleganckie rozwiązanie miałem nadzieję na:

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

z góry dzięki :)

Odpowiedz

8

Użyj if/else konstrukt: the martwy kod będzie usunięty przez kompilator i nie będzie testowany w czasie wykonywania. Będziesz mieć tylko jedną wersję swojego kodu w swf.

Jeśli nie masz pewności, użyj narzędzia do dekompilacji lub zrzutu, aby zobaczyć, co naprawdę się dzieje.

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

http://www.swftools.org/

...

+1

Wydaje się być rozsądnym. Z drugiej strony, kompilator Flash/Flex może być głupi, tak jak mówisz, sprawdziłbym go przed użyciem, jeśli wydajność naprawdę ma dla ciebie znaczenie. – aaaidan

+3

-1. Konstrukcja * if/else * nie działa. Prosty test, aby to udowodnić: [Osadź] ciężki plik w takim bloku if/else. Jeśli wyjściowy rozmiar pliku zmieni się odpowiednio, to działa, inaczej nie. Również taki blok if/else powoduje błędy składni, gdy jest używany poza funkcją, która prowadzi do wniosku, że blok kodu nie zostanie usunięty! – bummzack

+0

Tak, myślę, że ta technika polega za bardzo na efekcie ubocznym optymalizatora. Kompilacja warunkowa jest znacznie lepsza. Jeśli potrzebujesz czegoś takiego jak #ifndef, zobacz moją odpowiedź poniżej. –

22

Działa to dobrze i będzie rozebrać się kod, który nie będzie działać:

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

BUT ta zostanie oceniona na czas wykonania:

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

mxmlc najwyraźniej może jedynie ocenić literalną wartość logiczną, a nie dowolny rodzaj wyrażenia, w tym prosty , a nie.

+0

Czy mógłbyś zacytować dokumentację? –

+1

To powinna być poprawna odpowiedź ... – Pier

4

Podczas gdy odpowiedź Patricka spełnia kryteria pytania, nie obejmuje wszystkich przypadków użycia. Jeśli jesteś w obszarze kodu, który pozwala ci użyć instrukcji if/else, to jest to dobra odpowiedź. Ale jeśli jesteś w miejscu, w którym nie możesz, to potrzebujesz lepszego rozwiązania. Na przykład, może chcesz zrobić coś takiego zadeklarować stałą w klasie:

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

lub żywym wydaniu:

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

(jest to przykład i nie jestem propagowanie to jako kod produkcyjny).

Używam konfiguracji xml i używam loadConfig + = "myconfig.xml", aby wykonać moją konfigurację, zamiast przekazywać dużą liczbę parametrów linii poleceń.Więc w sekcji <compiler> swojej xml config:

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

Działa to dobrze dla wszystkich przypadków użycia:

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

Ma to dodatkową korzyść działa konsekwentnie w całej aplikacji. Nie polega też na tym, że flaga "optimize" jest prawdziwa, jak na przykład odpowiedź Patricka (chociaż myślę, że możemy założyć, że 99,999999% wszystkich plików swf ma wartość optimize = true, ustawiam ją na wartość false tylko wtedy, gdy optymalizator zepsuje mój AS3).

Ma tę wadę, że nie kompiluje wszystkich ścieżek kodu, tylko te, które są zawarte. Więc jeśli nie korzystasz z serwera kompilacji, aby tworzyć kompilacje wydań i mówisz, kiedy coś się załamuje, przygotuj się na błędy niespodzianki, gdy wykonasz kompilację wydania ("Ale skompilowałem ją w debugowaniu! Crap, potrzebuję tego, aby uruchomić teraz!").

+0

To wydaje się być najbardziej eleganckim rozwiązaniem. mniej parametrów kompilatora i dobra separacja w zewnętrznym pliku XML. Aby to działało, plik XML powinien zawierać dodatkowy element główny "flex-config", tak jak tutaj: http://help.adobe.com/en_US/air/build/WSfffb011ac560372f2012b5a4128cca83a39-8000.html. Znalazłem również: http://www.flashdevelop.org/community/viewtopic.php?f=13&t=9696 , który używa atrybutu "append = true". Próbowałem już tego wszystkiego, ale nadal moja aplikacja nie działa tak, jak to zrobiła bez argumentów xml. to jednak się kompiluje. Ktoś mający podobne problemy? –

+0

Nie mogę edytować mojego poprzedniego komentarza, ale: po ponownym przeczytaniu wady, ma to sens. Używam dodatkowych ścieżek źródłowych dla mojego projektu, w tym projektu bibliotecznego. Aby dodać: nie tylko kompilacje wydań przestaną działać. również regularne kompilacje debugowania :(Które w sumie są naprawdę złe, ponieważ jest to miły i czysty sposób na kompilację warunkową, no cóż, na szybkie i brudne i działające wtedy –

+0

Przykro nam, że masz problemy. z plikami XML i naprawdę są naprawdę dobre, gdy pracujesz nad naprawdę dużymi projektami z, powiedzmy, 5 środowiskami programistycznymi! Oto przykładowy plik config xml, który użyłem dla małego prototypu. będzie używać na dużą skalę projektu: http://enemyhideout.com/example_flex_configs/game-flex-config.xml –

0

Tylko moje dwa grosze na temat odpowiedzi Chrisa Hilla (jest to rozwiązanie, którego również używam regularnie): wygląda na to, że użycie opcji loadConfig + = "myconfig.xml" powoduje, że kompilator wyszukuje plik myconfig.xml w pakiecie Flex SDK katalog, natomiast opcja -load-config + = myconfig.xml sprawia, że ​​szuka pliku myconfig.xml w katalogu projektu, co jest zachowaniem, które zdecydowanie preferuję, ponieważ możesz wtedy łatwo dystrybuować ten plik ze źródłami projektów ...