Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haxe:如何防止未使用的类被删除_Haxe - Fatal编程技术网

Haxe:如何防止未使用的类被删除

Haxe:如何防止未使用的类被删除,haxe,Haxe,我的类从未在其他代码中直接提到过,但只能使用Type.resolveClass访问。我希望它们被编译并包含在应用程序中,但我不知道如何做到这一点。我认为@:keep(或@:keepSub)正是为了这个,但它并没有像我预期的那样工作。我就是这么做的: Main.hx: package; //import Foo; //uncomment this line to make it work class Main { static function main() trace(Type.reso

我的类从未在其他代码中直接提到过,但只能使用
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'));
}
package;
@:keep class Foo {}
Foo.hx

package;
//import Foo; //uncomment this line to make it work
class Main {
    static function main() trace(Type.resolveClass('Foo'));
}
package;
@:keep class Foo {}
但是这个跟踪
null
(我已经测试过JS和Flash) 即使我使用
-dce no
编译,它仍然跟踪
null


不确定是编译器问题还是我不了解它是如何工作的。

这不是编译器问题,而是正确的行为。如果从未导入模块,则从一开始就不会将其包含在编译中。编译器永远看不到
@:keep

一种常见的解决方法是使用
--macro include('package')
(请参阅),这将强制编译
包中的所有模块

请注意,通配符导入(
导入包。*;
)不起作用,因为:

在包上使用通配符导入时,编译器不会急于处理该包中的所有模块。这意味着,除非显式使用这些模块,否则编译器永远不会看到这些模块,并且它们不是生成的输出的一部分


@:keep
@:keepSub
仅保留类。在您的例子中,Foo从未包含在编译中,因此编译器没有什么需要保留的

您可以在hxml(或
haxe…
命令)中列出应用程序的多个入口点,以包括一些类:
haxe-cp src-main MainFoo Foo--interp
将查找Foo。(有关
--interp
的更多信息,请点击此处:)

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

有关的更多信息包括: