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

rom*_*mik 4 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'));
}
Run Code Online (Sandbox Code Playgroud)

Foo.hx:

package;
@:keep class Foo {}
Run Code Online (Sandbox Code Playgroud)

但这个痕迹null(我已经测试过JS和Flash)即使我用-dce no它编译仍然有痕迹null.

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

Gam*_*a11 8

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

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

请注意,通配符import(import package.*;)将不起作用,因为通配符导入是惰性的.


kLa*_*abz 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')但在您的示例中,您的类位于根包中,我不知道您是否可以包含此类.

有关更多信息,请访问:http://api.haxe.org/haxe/macro/Compiler.html#include