Подтвердить что ты не робот

Flash/Flex условная компиляция "else"

В AS3 вы можете передать константу компилятору

-define+=CONFIG::DEBUG,true

И используйте его для условной компиляции следующим образом:

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

Я ищу что-то вроде #ifndef, поэтому я могу отрицать значение отладки и использовать его для условного добавления кода выпуска. Единственное решение, которое я нашел до сих пор, было в документации условной компиляции в adobe, и поскольку мои конфигурации отладки и выпуска взаимоисключающие меня не меняют как идея иметь как константы DEBUG, так и RELEASE.

Кроме того, этот формат работает, но я предполагаю, что он запускает проверку во время выполнения, что не то, что я хочу:

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

Я также подумал о том, чтобы сделать что-то подобное, но это еще не элегантное решение, на которое я надеялся:

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

Заранее спасибо:)

4b9b3361

Ответ 1

Используйте конструкцию if / else: мертвый код будет удален компилятором, и он не будет протестирован во время выполнения. У вас будет только одна версия вашего кода в вашем swf.

Если вы не уверены, используете декомпилятор или инструмент дампа, чтобы увидеть, что на самом деле происходит.

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

http://www.swftools.org/

...

Ответ 2

Это отлично работает и вычеркивает код, который не будет работать:

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

НО, это будет оцениваться во время выполнения:

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

mxmlc, по-видимому, может оценивать только литерал Boolean, а не какое-либо выражение, включая простое.

Ответ 3

Хотя ответ Патрика отвечает критериям вопроса, он не охватывает все варианты использования. Если вы находитесь в области кода, которая позволяет вам использовать инструкцию if/else, то это хороший ответ. Но если вы находитесь в том месте, где вы не можете, вам понадобится лучшее решение. Например, вы можете сделать что-то вроде этого, чтобы объявить константу в классе:

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

или для живого релиза:

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

(это пример, и я не защищаю это как производственный код).

Я использую xml configs и использую loadConfig + = "myconfig.xml" для выполнения моей конфигурации вместо передачи большого количества параметров командной строки. Итак, в разделе <compiler> вашего xml config:

<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";
}

Это имеет дополнительное преимущество для совместной работы приложений. Он также не полагается на то, что флаг "optimize" является истинным, как говорит Патрик (хотя я думаю, что мы можем предположить, что 99% всех swfs оптимизированы = true, я устанавливаю только false, когда оптимизатор разбивает мой AS3).

У него есть недостаток, что он не компилирует все пути кода, а только те, которые включены. Поэтому, если вы не используете сервер сборки для создания сборников релизов и не говорите вам, когда что-то ломается, будьте готовы к неожиданным ошибкам, когда вы делаете свою сборку ( "Но она скомпилирована в отладке! Crap, мне нужно это для запуска сейчас!" ).

Ответ 4

Только мои два цента о Крисе Хилле отвечают (это решение, которое я также использую регулярно): кажется, что использование опции loadConfig + = "myconfig.xml" делает компилятор для поиска файла myconfig.xml в каталоге Flex SDK в то время как опция -load-config + = myconfig.xml делает поиск файла myconfig.xml в каталоге проекта, что является поведением, которое я предпочитаю, так как вы можете легко распространять этот файл с вашими источниками проекта...