Условная компиляция "еще" - PullRequest
28 голосов
/ 29 апреля 2010

В 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

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

Ответы [ 4 ]

22 голосов
/ 01 ноября 2010

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

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

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

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

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

8 голосов
/ 29 апреля 2010

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

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

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

http://www.swftools.org/

...

4 голосов
/ 28 июня 2012

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

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

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

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

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

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

<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,999999% всех SWF-файлов имеют optimize = true, я устанавливаю его в false, когда оптимизатор ломает мой AS3).

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

0 голосов
/ 27 февраля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...