【问题标题】:How to get path to "haxe.exe" from macro/eval?如何从宏/评估中获取“haxe.exe”的路径?
【发布时间】:2019-01-18 22:08:21
【问题描述】:

我想从 haxe eval 脚本(或宏)生成一个子进程。这个子进程也是haxe的一个实例,编译父进程下载/生成的代码。显然,我可以简单地使用

Sys.command('haxe -cpp $buildDir -main CoreMain $coreDefines');

但如果可能的话,我想使用haxe.exe 的确切路径(*nix 上的haxe)。到目前为止,我还没有找到从 eval 或宏中获取此路径的 API。是我遗漏了什么还是没有这样的 API?

【问题讨论】:

    标签: haxe


    【解决方案1】:

    我不知道有任何 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(因为需要登录/注销才能更新环境变量),但您可能可以在这个过程然后用Sys.getEnv()得到它?不过,为每个操作系统制作自定义内容时也会遇到同样的问题。

    【讨论】:

    • 如果 haxe 已经在PATH 中,那么我看不出which 会比操作系统从haxe ... 命令解析路径做得更好。如果 haxe 不在 PATH 中或者我需要不同的版本,那么 HAXEPATH 可能是一个解决方案。我会调查的。无论如何谢谢。
    • 当您使用 haxe_shim / lix 使用不同的 haxe 版本时,这是不准确的。
    【解决方案2】:

    另一种解决方案是使用宏来访问直接位于 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 );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多