Haxe:如何防止未使用的课程被淘汰

时间:2017-02-03 10:03:33

标签: haxe

我的类在其他代码中从未直接提及,但只能使用Type.resolveClass访问。我希望它们被编译并包含在应用程序中,但我无法知道如何做到这一点。我认为@:keep(或@:keepSub)正好适用于此,但它并不像我预期的那样有效。这就是我的工作:

Main.hx

package;
//import Foo; //uncomment this line to make it work
class Main {
    static function main() trace(Type.resolveClass('Foo'));
}

Foo.hx

package;
@:keep class Foo {}

但这跟踪null(我已经测试了JS和Flash) 即使我使用-dce no进行编译,它仍会跟踪null

不确定这是编译器问题还是我不​​明白它是如何工作的。

2 个答案:

答案 0 :(得分:8)

这不是编译器问题,它是正确的行为。如果永远不会导入模块,则它永远不会包含在编译中。编译器永远不会看到@:keep

常见的解决方法是使用--macro include('package')(请参阅Compiler.include()),这会强制编译package中的所有模块。

请注意,通配符导入(import package.*;)无法正常工作,因为wildcard imports是懒惰的。

答案 1 :(得分:6)

@:keep@:keepSub保留类。在您的情况下,Foo从未包含在编译中,因此编译器无需保留。

您可以在hxml(或haxe ...命令)中列出应用程序的多个入口点以包含一些类:haxe -cp src -main MainFoo Foo --interp将找到Foo。 (更多关于--interp此处:http://old.haxe.org/doc/compiler#macro-options

您还可以使用--macro include('my.package')包含一个包及其所有类,但在您的示例中,您的类位于根包中,我不知道您是否可以包含此类。

有关include:http://api.haxe.org/haxe/macro/Compiler.html#include

的更多信息