【问题标题】:How do I get haxe to generate externs?如何让 haxe 生成外部变量?
【发布时间】:2016-12-15 14:08:45
【问题描述】:

我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”来处理这个问题(即在编译时完全内联所有库)。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间进行内联。这样做的自然方法是让源 Haxe 文件和一个单独的“头”目录充满 extern 描述我的模块的公共 API,这些 externs 以某种方式自动生成,因此它们不会需要手动维护。

我不知道如何让 Haxe 发出 externs。如果haxe-externs 是实际的“target platform” 对我来说是有意义的,这样我就可以做类似的事情:

$ haxe ClassName -hxe externsoutdir

如果 -D 标志之一像 -D dump (这似乎是其中的一部分)或一些虚构的、不存在的 -D dump-externs 存在,这将不太有意义,但仍然可以接受。然后你可以在编译到你最喜欢的目标时生成外部:

$ haxe ClassName -js outfile.js -D shallow-expose -D dump-externs=externsoutdir

我们的想法是采用这样的类定义:

@:expose
class ClassName {
    function quack() {
    trace('quack');
    }
}

并在单独的目录中发出类似的内容:

extern class ClassName {
    function quack():Void;
}

这样我就可以像这样从另一个模块中使用它:

@:expose
class MyClassName extends ClassName {
    override function quack() {
    super.quack();
    trace('…and again I say “quack”');
    }
}

$ haxe -cp path\to\externsoutdir MyClassName -js outfile.js -D shallow-expose

只有为用@:expose 或其他装饰器装饰的东西生成externs 才有意义。

我将弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成 extern 定义——难道 Haxe 不应该已经有办法做到这一点吗?

是否已经有一些我缺少的工具或内置方法可以做到这一点?在谷歌上搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部的项目。但这不是我的用例……

【问题讨论】:

    标签: haxe


    【解决方案1】:

    更新: --gen-hx-classes 有时是 removed 在 Haxe 4.0.0-rc3 上。显然该功能仍然以-D gen-hx-classes 的身份秘密存在,但请注意,如果您依赖它,它似乎会消失。


    我相信--gen-hx-classes 选项可能是您正在寻找的。奇怪的是我在compiler flags list 中没有看到它。

    我在与您所说的类似的模块化 JavaScript 构建系统中使用它。

    我相信它会为构建生成的每个类(包括来自 Haxe 标准库的类)创建一个 .hx 文件目录。实际上,在标准库中获取类的副本可能是一个问题脸。

    您可能还需要使用@:keep(或相关宏)来确保死代码消除不会删除其他构建需要的东西。

    您可能还需要从一个或其他构建中排除一个类,例如--macro 'exclude("haxe.io.Input")'(或者,excludeFile 实际上对于整个排除列表的性能更高。)

    【讨论】:

    • 我现在还看到haxe-codegen 在将“gen-hx-classes”添加到我的 Google 关键字列表后存在。这很有帮助,我将使用那个编译器开关位。谢谢!
    • 幸运的是,我将所有内容都放在了以供应商命名的包中,因此我避免重复定义的策略是只获取包的子目录并忽略所有其他生成的标头。
    • 好吧,基本上,这还不够,因为--gen-hx-classes doesn’t output modules correctly 哪个breaks my codecodegen 库似乎可以正确处理这些情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多