如何从 macro/eval 获取到 "haxe.exe" 的路径?
How to get path to "haxe.exe" from macro/eval?
我想从 haxe eval 脚本(或宏)生成一个子进程。这个子进程也是haxe的一个实例,由parent编译代码downloaded/generated。显然,我可以简单地使用
Sys.command('haxe -cpp $buildDir -main CoreMain $coreDefines');
但如果可能,我想使用 haxe.exe
(haxe
on *nix)的确切路径。到目前为止,我还没有找到 API 从 eval 或宏中获取这条路径。我是不是遗漏了什么或者没有这样的东西 API?
我不知道有任何 API 选项可用于获取 haxe
二进制文件的路径,但应该有一个 HAXEPATH environment variable
可以用 Sys.getEnv()
?
否则您可能能够启动一个进程,找到路径,并将其写入文件:
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(因为需要记录 in/out 以更新环境变量),但您 可能 可以在进程中设置环境变量然后用Sys.getEnv()
获取吗?不过,为每个 OS 制作自定义物品时也会出现同样的问题。
另一种解决方案是使用宏来访问直接位于 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 );
}
}
我想从 haxe eval 脚本(或宏)生成一个子进程。这个子进程也是haxe的一个实例,由parent编译代码downloaded/generated。显然,我可以简单地使用
Sys.command('haxe -cpp $buildDir -main CoreMain $coreDefines');
但如果可能,我想使用 haxe.exe
(haxe
on *nix)的确切路径。到目前为止,我还没有找到 API 从 eval 或宏中获取这条路径。我是不是遗漏了什么或者没有这样的东西 API?
我不知道有任何 API 选项可用于获取 haxe
二进制文件的路径,但应该有一个 HAXEPATH environment variable
可以用 Sys.getEnv()
?
否则您可能能够启动一个进程,找到路径,并将其写入文件:
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(因为需要记录 in/out 以更新环境变量),但您 可能 可以在进程中设置环境变量然后用Sys.getEnv()
获取吗?不过,为每个 OS 制作自定义物品时也会出现同样的问题。
另一种解决方案是使用宏来访问直接位于 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 );
}
}