在AS3中,您可以将常量传递给编译器
-define+=CONFIG::DEBUG,true
并将其用于条件编译,如下所示:
CONFIG::DEBUG {
trace("This only gets compiled when debug is true.");
}
我正在寻找类似#ifndef的东西,这样我就可以否定DEBUG的值,并使用它来有条件地添加发布代码。到目前为止,我找到的唯一解决方案是在adobe的conditional compilation documentation中,因为我的调试和发布配置是互斥的,所以我不喜欢同时拥有调试和发布常量的想法。
此外,这种格式可以工作,但我假设它在运行时运行检查,这不是我想要的:
if (CONFIG::DEBUG) {
//debug stuff
}
else {
//release stuff
}
我也考虑过做这样的事情,但这仍然不是我希望的优雅解决方案:
-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG
提前感谢:)
4条答案
按热度按时间eqoofvh91#
这可以很好地工作,并且会去掉不能运行的代码:
但这将在运行时计算:
Mxmlc显然只能计算文字布尔值,而不能计算任何类型的表达式,包括简单的NOT。
ldxq2e6h2#
使用
if / else
结构:死代码将被编译器移除,并且不会在运行时进行测试。您的SWF中将只有一个版本的代码。如果您不确定,请使用反编译器或转储工具来查看实际发生的情况。
http://apparat.googlecode.com/files/dump.zip
http://www.swftools.org/
..。
7jmck4yq3#
虽然Patrick的答案满足问题的标准,但它并不涵盖所有用例。如果您所在的代码区域允许您使用if/Else语句,那么这是一个很好的答案。但如果你处在一个你做不到的地方,那么你将需要一个更好的解决方案。例如,您可能想要执行如下操作来声明类中的常量:
或者是现场发布:
(这只是一个例子,我并不提倡将其作为产品代码)。
我使用XML配置并使用loadConfig+=“myconfig.xml”来进行配置,而不是传递大量的命令行参数。因此,在您的XML配置的
<compiler>
部分:这适用于所有用例:
这还有一个额外的好处,即跨应用程序一致地工作。它也不像帕特里克的答案那样依赖于‘OPTIMIZE’标志为真(尽管我认为我们可以假设所有SWF中有99.999999的OPTIMIZE=TRUE,我只在优化器破坏我的AS3时才将其设置为FALSE)。
它确实有一个缺点,那就是它不编译所有代码路径,只编译包含的那些代码路径。因此,如果您不是使用构建服务器来创建发布构建并在出现问题时通知您,那么在进行发布构建时要为意外错误做好准备(“但是它是在调试中编译的!废话,我需要现在就启动它!”)。
d6kp6zgx4#
我对Chris Hill的回答(这也是我经常使用的解决方案)只有两点看法:似乎使用
loadConfig+="myconfig.xml"
选项使编译器在Flex SDK目录中搜索myconfig.xml文件,而-load-config+=myconfig.xml
选项使其在项目目录中搜索myconfig.xml
文件,这是我强烈喜欢的行为,因为这样您就可以很容易地将该文件与项目源代码一起分发……