tak*_*eek 28 apache-flex flash actionscript-3
在AS3中,您可以将常量传递给编译器
-define+=CONFIG::DEBUG,true
Run Code Online (Sandbox Code Playgroud)
并将其用于条件编译,如下所示:
CONFIG::DEBUG {
trace("This only gets compiled when debug is true.");
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找类似#ifndef的东西,所以我可以否定调试的价值并使用它来有条件地添加发布代码.我发现的唯一的解决办法,到目前为止是在条件编译文档的Adobe和因为我的调试和发布配置是相互排斥的,我不喜欢同时具有DEBUG的想法和释放常数.
此外,这种格式有效,但我假设它在运行时运行检查,这不是我想要的:
if (CONFIG::DEBUG) {
//debug stuff
}
else {
//release stuff
}
Run Code Online (Sandbox Code Playgroud)
我也考虑过做这样的事情,但它仍然不是我希望的优雅解决方案:
-define+=CONFIG::DEBUG,true -define+=CONFIG::RELEASE,!CONFIG::DEBUG
Run Code Online (Sandbox Code Playgroud)
提前致谢 :)
Pet*_*all 22
这工作正常,将删除不会运行的代码:
if (CONFIG::DEBUG) {
//debug stuff
}
else {
//release stuff
}
Run Code Online (Sandbox Code Playgroud)
但这样会在运行时进行评估:
if (!CONFIG::DEBUG) {
//release stuff
}
else {
//debug stuff
}
Run Code Online (Sandbox Code Playgroud)
mxmlc显然只能评估一个文字布尔值,而不是任何一种表达式,包括一个简单的不.
使用if / else构造:编译器将删除死代码,并且不会在运行时对其进行测试.您的swf中只有一个版本的代码.
如果您不确定使用反编译器或转储工具来查看实际发生的情况.
http://apparat.googlecode.com/files/dump.zip
...
虽然帕特里克的回答符合问题的标准,但并未涵盖所有用例。如果您所在的代码区域允许您使用 if/else 语句,那么这是一个很好的答案。但是,如果您身处无法做到的地方,那么您将需要更好的解决方案。例如,你可能想要做这样的事情来声明一个类中的常量:
private var server:String = "http://localhost/mystagingenvironment";
Run Code Online (Sandbox Code Playgroud)
或现场发布:
private var server:String = "http://productionserver.com";
Run Code Online (Sandbox Code Playgroud)
(这是一个示例,我不提倡将其作为生产代码)。
我使用 xml 配置并使用 loadConfig+="myconfig.xml" 进行配置,而不是传递大量命令行参数。所以在<compiler>你的 xml 配置部分:
<define>
<name>CONFIG::debug</name>
<value>false</value>
</define>
<define>
<name>CONFIG::release</name>
<value>!CONFIG::debug</value>
</define>
Run Code Online (Sandbox Code Playgroud)
这适用于所有用例:
CONFIG::debug
{
private var server:String = "http://localhost/mystagingenvironment";
}
CONFIG::release
{
private var server:String = "http://productionserver.com";
}
Run Code Online (Sandbox Code Playgroud)
这具有跨应用程序一致工作的额外好处。它也不依赖于“优化”标志为真,就像帕特里克的回答一样(尽管我认为我们可以假设 99.999999% 的 swfs 都具有优化 = 真,我只在优化器破坏我的 AS3 时将它设置为假)。
它的缺点是它不编译所有代码路径,只编译包含的那些。因此,如果您没有使用构建服务器来创建发布构建并在出现问题时告诉您,那么在您进行发布构建时要为意外错误做好准备(“但它是在调试中编译的!糟糕,我现在需要它来启动!” )。