Haxe:如何防止未使用的 class 被淘汰
Haxe: how to keep unused class from being eliminated
我有 类 从未在其他代码中直接提及,但只能使用 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
。
不确定这是编译器问题还是我不明白它是如何工作的。
这不是编译器问题,这是正确的行为。如果一个模块从未被导入,它就永远不会包含在编译中。编译器永远看不到 @:keep
.
一个常见的解决方法是使用 --macro include('package')
(参见 Compiler.include()
),这会强制编译 package
中的所有模块。
请注意,通配符导入 (import package.*;
) 将不起作用,因为 wildcard imports are lazy:
When using wildcard imports on a package the compiler does not eagerly process all modules in that package. This means that these modules are never actually seen by the compiler unless used explicitly and are then not part of the generated output.
@: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')
中,但在您的示例中,您的 类 在根包中,我不知道您是否可以包含这个。
我有 类 从未在其他代码中直接提及,但只能使用 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
。
不确定这是编译器问题还是我不明白它是如何工作的。
这不是编译器问题,这是正确的行为。如果一个模块从未被导入,它就永远不会包含在编译中。编译器永远看不到 @:keep
.
一个常见的解决方法是使用 --macro include('package')
(参见 Compiler.include()
),这会强制编译 package
中的所有模块。
请注意,通配符导入 (import package.*;
) 将不起作用,因为 wildcard imports are lazy:
When using wildcard imports on a package the compiler does not eagerly process all modules in that package. This means that these modules are never actually seen by the compiler unless used explicitly and are then not part of the generated output.
@: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')
中,但在您的示例中,您的 类 在根包中,我不知道您是否可以包含这个。