在AS3中,您可以将常量传递给编译器
-define+=CONFIG::DEBUG,true
并将其用于条件编译,如下所示:
CONFIG::DEBUG {
trace("This only gets compiled when debug is true.");
}
我正在寻找像#ifndef这样的东西,所以我可以否定调试的价值并使用它来有条件地添加发布代码。到目前为止,我发现的唯一解决方案是在adobe的conditional compilation documentation中,因为我的调试和发布配置是互斥的,所以我不喜欢同时使用DEBUG和RELEASE常量。
此外,这种格式有效,但我假设它在运行时运行检查,这不是我想要的:
if (CONFIG::DEBUG) {
//debug stuff
}
else {
//release stuff
}
我也考虑过做这样的事情,但它仍然不是我希望的优雅解决方案:
-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG
提前致谢:)
答案 0 :(得分:22)
这样可以正常工作并删除不会运行的代码:
if (CONFIG::DEBUG) {
//debug stuff
}
else {
//release stuff
}
但是这将在运行时进行评估:
if (!CONFIG::DEBUG) {
//release stuff
}
else {
//debug stuff
}
mxmlc显然只能评估文字布尔值,而不能评估任何类型的表达式,包括简单的而不是。
答案 1 :(得分:8)
使用if / else
构造:死代码将被编译器删除,并且不会在运行时进行测试。您的swf中只有一个版本的代码。
如果您不确定使用反编译器或转储工具来查看实际发生的情况。
http://apparat.googlecode.com/files/dump.zip
...
答案 2 :(得分:4)
虽然帕特里克的答案符合问题的标准,但它并未涵盖所有用例。如果您所在的代码区域允许您使用if / else语句,那么这是一个很好的答案。但是,如果你所在的地方你不能,那么你将需要一个更好的解决方案。例如,您可能希望执行类似的操作来在类中声明常量:
private var server:String = "http://localhost/mystagingenvironment";
或实时发布:
private var server:String = "http://productionserver.com";
(这是一个例子,我不是把它作为生产代码提倡的。)
我使用xml配置并使用loadConfig + =“myconfig.xml”来进行配置,而不是传递大量的命令行参数。所以在你的xml配置的<compiler>
部分:
<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";
}
这具有跨应用程序一致工作的额外好处。它也不依赖于'优化'标志是真的,就像Patrick的答案一样(尽管我认为我们可以假设所有swfs的99.999999%都有optimize = true,我只在优化器破坏我的AS3时将其设置为false)。
它的缺点是它不能编译所有代码路径,只包括所包含的代码路径。因此,如果您没有使用构建服务器来创建发布版本并告诉您何时中断,请在执行发布版本时为出现意外错误做好准备(“但它在调试中编译!Crap,我现在需要启动它!” )。
答案 3 :(得分:0)
关于Chris Hill的回答(这也是我经常使用的解决方案)的两分钱:似乎使用loadConfig + =“myconfig.xml”选项使编译器在Flex SDK目录中搜索myconfig.xml文件而-load-config + = myconfig.xml选项使它在项目目录中搜索myconfig.xml文件,这是我非常喜欢的行为,因为您可以使用项目源轻松分发此文件...