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
Заранее спасибо:)
Ответы
Ответ 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 в каталоге проекта, что является поведением, которое я предпочитаю, так как вы можете легко распространять этот файл с вашими источниками проекта...