【问题标题】:Haxe: how to keep unused class from being eliminatedHaxe:如何防止未使用的类被淘汰
【发布时间】:2017-02-03 10:03:32
【问题描述】:

我的类在其他代码中从未直接提及,但只能使用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

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

【问题讨论】:

    标签: haxe


    【解决方案1】:

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

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

    请注意,通配符导入 (import package.*;) 将不起作用,因为 wildcard imports are lazy

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

    【讨论】:

      【解决方案2】:

      @:keep@:keepSubkeep 类。在您的情况下, 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

      【讨论】:

        猜你喜欢
        • 2014-01-20
        • 1970-01-01
        • 2015-09-28
        • 2019-01-21
        • 2015-01-29
        • 1970-01-01
        • 2011-08-02
        • 2012-11-26
        • 2017-02-15
        相关资源
        最近更新 更多