我想从haxe eval脚本(或宏)产生一个子进程。这个子进程也是haxe的一个实例,它编译由父进程下载/生成的代码。显然,我可以简单地使用
Sys.command('haxe -cpp $buildDir -main CoreMain $coreDefines');
但我想尽可能使用到haxe.exe
(在* nix上的haxe
)的确切路径。到目前为止,我还没有找到从eval或macro获取此路径的API。我是否缺少某些东西或没有此类API?
答案 0 :(得分:2)
我不知道有任何API选项可用于获取到haxe
二进制文件的路径,但是应该有Sys.getEnv()
可以引用的HAXEPATH environment variable
吗? / p>
否则,您也许可以启动进程,找到路径并将其写入文件:
function getHaxeBinPath () : String {
var path = switch ( Sys.systemName () ) {
case "Windows":
// Windows Script.
case "Linux":
Sys.command ( "echo $( which haxe ) >> exePath.txt" );
Sys.io.File.getContent ( "exePath.txt" );
case "BSD":
// BSD Script.
case "Mac":
// Macintosh Script.
default:
throw "Unknown Operating System!";
}
if ( sys.FileSystem.exists ( "exePath.txt" ) {
sys.FileSystem.deleteFile ( "exePath.txt" );
}
return path;
}
,但是随后您将需要每个操作系统的脚本并说明事物的版本。如果您决定这样做,我认为Windows可能会使用WHERE命令,但是我对此并不了解。
这似乎不适用于* nix(因为需要登录/注销以更新环境变量),但是您可能可以在其中设置环境变量然后使用Sys.getEnv()
来获得它?不过,为每个操作系统制作自定义商品也存在同样的问题。
答案 1 :(得分:0)
另一种解决方案是使用宏来访问直接位于 Haxe 标准库中的类型的位置信息:
import haxe.macro.Context;
function resolveHaxePath() : String {
return switch Context.getType( "StdTypes.Void" ) {
case TAbstract(_.get() => a,_):
final pos = Context.getPosInfos( a.pos );
pos.file.substr( 0, pos.file.lastIndexOf("std") - 1 );
case _:
Context.fatalError( "Fail to resolve the compiler's path", (macro _).pos );
}
}