我的类在其他代码中从未直接提及,但只能使用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
。
不确定这是编译器问题还是我不明白它是如何工作的。
答案 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
的更多信息