React native 使用hermes:';生成应用程序时出错';不被识别为内部或外部命令

React native 使用hermes:';生成应用程序时出错';不被识别为内部或外部命令,react-native,react-native-hermes,React Native,React Native Hermes,在Windows 10上构建react本机应用程序。 针对节点模块\react native\react.gradle的第165行打印错误: def getHermesCommand = { // If the project specifies a Hermes command, don't second guess it. if (!hermesCommand.contains("%OS-BIN%")) { return hermesCo

在Windows 10上构建react本机应用程序。

  • 针对节点模块\react native\react.gradle的第165行打印错误:

    def getHermesCommand = {
        // If the project specifies a Hermes command, don't second guess it.
        if (!hermesCommand.contains("%OS-BIN%")) {
            return hermesCommand
        }
    
        // Execution on Windows fails with / as separator
        return hermesCommand
                .replaceAll("%OS-BIN%", getHermesOSBin())
                .replace('/' as char, File.separatorChar);
    }
    
  • “..”不被识别为内部或外部命令、可操作程序或批处理文件

    第165行是下面的第5行,从
    exec
    开始:

    if (enableHermes) {
                    doLast {
                        def hermesFlags;
                        def hbcTempFile = file("${jsBundleFile}.hbc")
                        exec {
                            if (targetName.toLowerCase().contains("release")) {
                                // Can't use ?: since that will also substitute valid empty lists
                                hermesFlags = config.hermesFlagsRelease
                                if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
                            } else {
                                hermesFlags = config.hermesFlagsDebug
                                if (hermesFlags == null) hermesFlags = []
                            }
    
                            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                commandLine("cmd", "/c", getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            } else {
                                commandLine(getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            }
                        }
                        ant.move(
                            file: hbcTempFile,
                            toFile: jsBundleFile
                        );
                        if (hermesFlags.contains("-output-source-map")) {
                            ant.move(
                                // Hermes will generate a source map with this exact name
                                file: "${jsBundleFile}.hbc.map",
                                tofile: jsCompilerSourceMapFile
                            );
                            exec {
                                // TODO: set task dependencies for caching
    
                                // Set up the call to the compose-source-maps script
                                workingDir(reactRoot)
                                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                    commandLine("cmd", "/c", *nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                } else {
                                    commandLine(*nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                }
                            }
                        }
                    }
                }
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // next added by Yossi
        hermesCommand: "../../node_modules/hermesengine/win64-bin/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    node_modules\hermes-engine\win64-bin\hermes.exe
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // -either- hermesCommand: "..\\..\\node_modules\\hermesengine\\win64-bin\\hermes",
        // -or- hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    以下是安卓/app/build.gradle中hermescommand的定义:

    if (enableHermes) {
                    doLast {
                        def hermesFlags;
                        def hbcTempFile = file("${jsBundleFile}.hbc")
                        exec {
                            if (targetName.toLowerCase().contains("release")) {
                                // Can't use ?: since that will also substitute valid empty lists
                                hermesFlags = config.hermesFlagsRelease
                                if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
                            } else {
                                hermesFlags = config.hermesFlagsDebug
                                if (hermesFlags == null) hermesFlags = []
                            }
    
                            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                commandLine("cmd", "/c", getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            } else {
                                commandLine(getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            }
                        }
                        ant.move(
                            file: hbcTempFile,
                            toFile: jsBundleFile
                        );
                        if (hermesFlags.contains("-output-source-map")) {
                            ant.move(
                                // Hermes will generate a source map with this exact name
                                file: "${jsBundleFile}.hbc.map",
                                tofile: jsCompilerSourceMapFile
                            );
                            exec {
                                // TODO: set task dependencies for caching
    
                                // Set up the call to the compose-source-maps script
                                workingDir(reactRoot)
                                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                    commandLine("cmd", "/c", *nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                } else {
                                    commandLine(*nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                }
                            }
                        }
                    }
                }
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // next added by Yossi
        hermesCommand: "../../node_modules/hermesengine/win64-bin/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    node_modules\hermes-engine\win64-bin\hermes.exe
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // -either- hermesCommand: "..\\..\\node_modules\\hermesengine\\win64-bin\\hermes",
        // -or- hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    据我所知,它指向以下文件:

    if (enableHermes) {
                    doLast {
                        def hermesFlags;
                        def hbcTempFile = file("${jsBundleFile}.hbc")
                        exec {
                            if (targetName.toLowerCase().contains("release")) {
                                // Can't use ?: since that will also substitute valid empty lists
                                hermesFlags = config.hermesFlagsRelease
                                if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
                            } else {
                                hermesFlags = config.hermesFlagsDebug
                                if (hermesFlags == null) hermesFlags = []
                            }
    
                            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                commandLine("cmd", "/c", getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            } else {
                                commandLine(getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            }
                        }
                        ant.move(
                            file: hbcTempFile,
                            toFile: jsBundleFile
                        );
                        if (hermesFlags.contains("-output-source-map")) {
                            ant.move(
                                // Hermes will generate a source map with this exact name
                                file: "${jsBundleFile}.hbc.map",
                                tofile: jsCompilerSourceMapFile
                            );
                            exec {
                                // TODO: set task dependencies for caching
    
                                // Set up the call to the compose-source-maps script
                                workingDir(reactRoot)
                                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                    commandLine("cmd", "/c", *nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                } else {
                                    commandLine(*nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                }
                            }
                        }
                    }
                }
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // next added by Yossi
        hermesCommand: "../../node_modules/hermesengine/win64-bin/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    node_modules\hermes-engine\win64-bin\hermes.exe
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // -either- hermesCommand: "..\\..\\node_modules\\hermesengine\\win64-bin\\hermes",
        // -or- hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    有什么想法吗

    更新了android/app/build.gradle中的定义(以下是答案):

    if (enableHermes) {
                    doLast {
                        def hermesFlags;
                        def hbcTempFile = file("${jsBundleFile}.hbc")
                        exec {
                            if (targetName.toLowerCase().contains("release")) {
                                // Can't use ?: since that will also substitute valid empty lists
                                hermesFlags = config.hermesFlagsRelease
                                if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
                            } else {
                                hermesFlags = config.hermesFlagsDebug
                                if (hermesFlags == null) hermesFlags = []
                            }
    
                            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                commandLine("cmd", "/c", getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            } else {
                                commandLine(getHermesCommand(), "-emit-binary", "-out", hbcTempFile, jsBundleFile, *hermesFlags)
                            }
                        }
                        ant.move(
                            file: hbcTempFile,
                            toFile: jsBundleFile
                        );
                        if (hermesFlags.contains("-output-source-map")) {
                            ant.move(
                                // Hermes will generate a source map with this exact name
                                file: "${jsBundleFile}.hbc.map",
                                tofile: jsCompilerSourceMapFile
                            );
                            exec {
                                // TODO: set task dependencies for caching
    
                                // Set up the call to the compose-source-maps script
                                workingDir(reactRoot)
                                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                                    commandLine("cmd", "/c", *nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                } else {
                                    commandLine(*nodeExecutableAndArgs, composeSourceMapsPath, jsPackagerSourceMapFile, jsCompilerSourceMapFile, "-o", jsOutputSourceMapFile)
                                }
                            }
                        }
                    }
                }
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // next added by Yossi
        hermesCommand: "../../node_modules/hermesengine/win64-bin/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    node_modules\hermes-engine\win64-bin\hermes.exe
    
    project.ext.react = [
        enableHermes: true,  // clean and rebuild if changing
        // -either- hermesCommand: "..\\..\\node_modules\\hermesengine\\win64-bin\\hermes",
        // -or- hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
        extraPackagerArgs: ["--sourcemap-output", "$buildDir/intermediates/assets/release/index.android.bundle.map"]
    ]
    
    更改后,现在的生成输出如下所示:
    下面是更多关于react.gradle的信息:

    def getHermesCommand = {
        // If the project specifies a Hermes command, don't second guess it.
        if (!hermesCommand.contains("%OS-BIN%")) {
            return hermesCommand
        }
    
        // Execution on Windows fails with / as separator
        return hermesCommand
                .replaceAll("%OS-BIN%", getHermesOSBin())
                .replace('/' as char, File.separatorChar);
    }
    
    您正在指定
    。/../node\u modules/hermesengine/win64 bin/hermes
    作为特定于操作系统的路径(由没有操作系统占位符决定)

    根据注释,
    react.gradle
    因此不会猜测您的路径,而是直接将其传递给OS命令解释器

    这会失败,因为命令解释器不允许将
    /
    作为目录分隔符

    指定对您的系统有效的路径:

    hermesCommand: "..\\..\\node_modules\\hermesengine\\win64-bin\\hermes",
    
    或者指定一个独立于操作系统的路径,让
    做出反应。gradle
    为每个平台转换它:

    hermesCommand: "../../node_modules/hermesengine/%OS-BIN%/hermes",
    

    你是说
    getHermesCommand()
    的输出只包含两个点吗?我明白你所看到的。。。。似乎是这样,为什么?您是否设置了
    project.ext.react.hermesCommand
    并意外地在两个点后添加了一个空格?请参见我问题的底部(已更新)。我得到了两个答案“系统无法找到指定的路径”。这两个答案是否仍然都是
    “…”
    ?您是指路径的定义吗?我根据你的建议更新了它。请参阅我问题底部的更新。不,我的意思是完整的错误消息是什么,包括之前、之后和周围的所有信息。在这两种情况下,它抱怨的路径仍然只是两个点吗?对不起。。。附于我的问题。