我如何让 haxe 生成 externs?
How do I get haxe to generate externs?
我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”(即在编译时完全内联所有库)来处理这个问题。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间进行内联。这样做的自然方法是同时拥有源 Haxe 文件和一个单独的“headers”目录,其中包含 extern
描述我的模块的 public API,其中这些 extern
以某种方式自动生成,因此不需要手动维护。
我不知道如何让 Haxe 发出外部事件。如果 haxe-externs
是一个实际的 “target platform” 对我来说是有意义的,这样我就可以做类似的事情:
$ haxe ClassName -hxe externsoutdir
如果像 -D dump
这样的 -D
标志之一(这似乎是其中的一部分)或一些虚构的、不存在的 -D dump-externs
存在。然后你可以在编译到你最喜欢的目标时生成 externs:
$ haxe ClassName -js outfile.js -D shallow-expose -D dump-externs=externsoutdir
想法是采用这样的 class 定义:
@: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
或其他装饰器装饰的东西生成 extern
才有意义。
我会弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成 extern
定义——Haxe 不应该已经有办法做到这一点吗?
是否已经有一些工具或 built-in 方法让我无法做到这一点?在谷歌搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部文件的项目。但这不是我的用例……
更新: --gen-hx-classes
在 Haxe 4.0.0-rc3 的某个时间 removed。显然该功能仍然作为 -D gen-hx-classes
秘密存在,但请注意,如果您依赖它,它似乎会消失。
我相信 --gen-hx-classes
选项可能就是您要找的。奇怪的是我在 compiler flags list.
中没有看到它
我在模块化 JavaScript 构建系统中使用它,与您所说的类似。
我相信它创建了一个 .hx 文件的目录,这些文件是构建生成的每个 class 的外部文件(包括那些来自 Haxe 标准库的文件。)实际上,获取 class 的副本标准库中的es可能是你会遇到的问题
您可能还需要使用 @:keep
(或相关宏)来确保消除死代码不会删除其他构建所需的东西。
您可能还需要从一个或另一个构建中排除 class,例如--macro 'exclude("haxe.io.Input")'
(或者,excludeFile 实际上对于整个排除列表的性能更高。)
我正在编写 haxe 代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想用“Haxe 方式”(即在编译时完全内联所有库)来处理这个问题。相反,我希望能够编写不同的 Haxe 模块并以完全类型安全的方式引用它们,而无需在模块之间进行内联。这样做的自然方法是同时拥有源 Haxe 文件和一个单独的“headers”目录,其中包含 extern
描述我的模块的 public API,其中这些 extern
以某种方式自动生成,因此不需要手动维护。
我不知道如何让 Haxe 发出外部事件。如果 haxe-externs
是一个实际的 “target platform” 对我来说是有意义的,这样我就可以做类似的事情:
$ haxe ClassName -hxe externsoutdir
如果像 -D dump
这样的 -D
标志之一(这似乎是其中的一部分)或一些虚构的、不存在的 -D dump-externs
存在。然后你可以在编译到你最喜欢的目标时生成 externs:
$ haxe ClassName -js outfile.js -D shallow-expose -D dump-externs=externsoutdir
想法是采用这样的 class 定义:
@: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
或其他装饰器装饰的东西生成 extern
才有意义。
我会弄清楚如何包装发出的模块以正确地相互加载。这很容易。困难的部分是生成 extern
定义——Haxe 不应该已经有办法做到这一点吗?
是否已经有一些工具或 built-in 方法让我无法做到这一点?在谷歌搜索时,我看到的都是据称有助于为现有 JavaScript 库生成外部文件的项目。但这不是我的用例……
更新: --gen-hx-classes
在 Haxe 4.0.0-rc3 的某个时间 removed。显然该功能仍然作为 -D gen-hx-classes
秘密存在,但请注意,如果您依赖它,它似乎会消失。
我相信 --gen-hx-classes
选项可能就是您要找的。奇怪的是我在 compiler flags list.
我在模块化 JavaScript 构建系统中使用它,与您所说的类似。
我相信它创建了一个 .hx 文件的目录,这些文件是构建生成的每个 class 的外部文件(包括那些来自 Haxe 标准库的文件。)实际上,获取 class 的副本标准库中的es可能是你会遇到的问题
您可能还需要使用 @:keep
(或相关宏)来确保消除死代码不会删除其他构建所需的东西。
您可能还需要从一个或另一个构建中排除 class,例如--macro 'exclude("haxe.io.Input")'
(或者,excludeFile 实际上对于整个排除列表的性能更高。)