我正在编写haxe代码,我想将其作为模块编译到任意目标,然后使用为同一目标编译的另一个模块的结果。我不想处理“Haxe方式”(这是在编译时完全内联所有库)。相反,我希望能够编写不同的Haxe模块,并以完全类型的安全性引用它们,而无需在模块之间进行内联。这样做的自然方法是让源Haxe文件和一个单独的“headers”目录填充extern
描述我模块的公共API,这些extern
以某种方式自动生成,以便它们不需要手动维护。
我无法弄清楚如何让Haxe发出外部信息。如果haxe-externs
是一个真实的“target platform”,那对我来说是有意义的,这样我就能做到这样的事情:
$ haxe ClassName -hxe externsoutdir
如果其中一个-D
标志像-D dump
(这似乎有点像那里的一部分那样)或一些想象的,不存在的{{1> }} 存在。然后,您可以在编译到您最喜欢的目标时生成外部:
-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
定义 - 难道Haxe不应该有办法做到这一点吗?
我是否已经缺少一些工具或内置方法来执行此操作?当谷歌搜索时,我看到的所有项目都可以帮助为现有的JavaScript库生成externs。但那不是我的用例...
答案 0 :(得分:2)
我相信--gen-hx-classes
选项可能就是你要找的东西。奇怪的是我没有在compiler flags list中看到它。
我在模块化的JavaScript构建系统中使用它,它类似于你所说的。
我相信它会创建一个.hx文件的目录,这些文件是构建生成的每个类的外部函数(包括来自Haxe标准库的那些)。实际上,在标准库中获取类的副本可能是个问题。面。
您可能还需要使用@:keep
(或相关的宏)来确保删除死代码不会删除其他构建所需的内容。
您可能还需要从一个或其他构建中排除一个类,例如--macro 'exclude("haxe.io.Input")'
(或excludeFile实际上对整个排除列表更具效果。)