如何让haxe产生外部效应?

时间:2016-12-15 14:08:46

标签: haxe

我正在编写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。但那不是我的用例...

1 个答案:

答案 0 :(得分:2)

我相信--gen-hx-classes选项可能就是你要找的东西。奇怪的是我没有在compiler flags list中看到它。

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

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

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

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