我正在编写一个宏,需要打开一个与我的宏类位于同一文件夹中的目录.问题是我需要能够做同样的事情,而不需要了解宏的文件夹.
我的问题很简单,有没有办法在宏中打开当前目录中的FileSystem.
例如:a(b(Macro.hx,c(...)))
当我从"Macro.hx"运行宏方法时,我需要直接打开"c"
如果你有个主意,谢谢:)
您可以在宏内部使用这样的函数:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,Context.resolvePath将解析相对于所有类路径的路径.因此,如果您的宏位于文件中my/package/MyMacro.hx,并且您想要加载my/package/MyMacroData.json,则可以使用:
haxe.macro.Context.resolvePath( 'my/package/MyMacroData.json' );
Run Code Online (Sandbox Code Playgroud)
这将检查构建中的每个类路径 - 包括任何haxelib等,因此它将找到您的文件,但是可以通过将文件放在相同的包/位置但是在不同的类路径或haxelib中来"遮蔽"它,所以尝试使用一个独特的包/名称,所以这不会偶然发生.
但它应该可以正常工作,如果你想看一个示例实现,我在我的编译时库中使用它.我已经使用相关代码链接到该函数.