我正在编写一个需要打开与我的宏类位于同一文件夹中的目录的宏。问题是我需要能够做同样的事情,而不需要了解宏的文件夹。
我的问题很简单,有没有办法在宏中打开当前目录中的FileSystem。
例如: a(b(Macro.hx,c(...)))
我需要打开" c"我直接从" Macro.hx"
运行宏方法如果您有任何想法,谢谢:)
答案 0 :(得分:6)
您可以在宏中使用这样的函数:
static function loadFileAsString(path:String) {
try {
var p = haxe.macro.Context.resolvePath(path);
return sys.io.File.getContent(p);
}
catch(e:Dynamic) {
return haxe.macro.Context.error('Failed to load file $path: $e', Context.currentPos());
}
}
基本上,Context.resolvePath
将解析相对于所有类路径的路径。因此,如果您的宏位于文件my/package/MyMacro.hx
中,并且您想要加载my/package/MyMacroData.json
,则可以使用:
haxe.macro.Context.resolvePath( 'my/package/MyMacroData.json' );
这会检查你的构建中的每个类路径 - 包括任何haxelib等,所以它会找到你的文件,但是它可以" shadow"它,通过在同一个包/位置,但在不同的类路径或haxelib中的文件,所以尝试使用一个独特的包/名称,所以这不会偶然发生。
但它应该可以正常工作,如果你想查看一个示例实现,我会在我的compiletime library中使用它。我已使用相关代码链接到该函数。