如何让 haxe 生成 extern?

问题描述 投票:0回答:2

我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”处理这个问题(即在编译时完全内联所有库)。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间内联。执行此操作的自然方法是同时拥有源 Haxe 文件和一个单独的“标头”目录,其中填充了描述我模块的公共 API 的

extern
,这些
extern
以某种方式自动生成,这样它们就不会需要手动维护。

我不知道如何让 Haxe 发出外部信号。如果

haxe-externs
是一个实际的“目标平台”,这对我来说是有意义的,这样我就可以做类似的事情:

$ 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

只有为用

extern
或其他装饰器装饰的东西生成
@:expose
才有意义。

我将弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成

extern
定义——Haxe 不应该已经有办法做到这一点吗?

我是否已经缺少一些工具或内置方法来执行此操作?当谷歌搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部的项目。但这不是我的用例......

haxe
2个回答
2
投票

更新:

--gen-hx-classes
在 Haxe 4.0.0-rc3 周围的某个时间被删除。显然,该功能仍然作为
-D gen-hx-classes
秘密存在,但请注意,如果您依赖于此,它似乎会消失。


我相信

--gen-hx-classes
选项可能就是您正在寻找的。奇怪的是我在编译器标志列表中没有看到它。

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

我相信它会创建一个 .hx 文件目录,这些文件是构建生成的每个类(包括 Haxe 标准库中的类)的外部文件。实际上,在标准库中获取类的重复项可能是您将面临的问题。

您可能还需要使用

@:keep
(或相关宏)来确保死代码消除不会删除其他构建所需的内容。

您可能还需要从一个或其他构建中排除某个类,例如

--macro 'exclude("haxe.io.Input")'
(或者,excludeFile实际上对于整个排除列表来说性能更高。)


0
投票

只需使用 codegen haxelib。这个基于宏的库可以为 JavaScript 和 TypeScript 生成 haxe extern。

© www.soinside.com 2019 - 2024. All rights reserved.