RN编译问题:Execution failed for task ':app:bundleStageReleaseJsAndAssets'.爬坑

问题log:
Successfully started process ‘command ‘node’’
internal/modules/cjs/loader.js:605
throw err;
^

Error: Cannot find module ‘/Users/xxxx/xxxx/xxxx/xxxx/node_modules/react-native/local-cli/cli.js’
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
at Function.Module._load (internal/modules/cjs/loader.js:529:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:775:12)
at startup (internal/bootstrap/node.js:300:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:826:3)
:app:bundleStageReleaseJsAndAssets FAILED
:app:bundleStageReleaseJsAndAssets (Thread[Task worker for ‘:’ Thread 3,5,main]) completed. Took 5.584 secs.

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ‘:app:bundleStageReleaseJsAndAssets’.
    Process ‘command ‘node’’ finished with non-zero exit value 1

主要原因是找不到node_modules/react-native/local-cli/cli.js,因为我的项目把JS代码,android原生,IOS原生代码分开了,所以默认的编译脚本就找不到node_modules了。

解决方法:
查看/node_modules/react-native/react.gradle文件,开头有段代码:


def config = project.hasProperty("react") ? project.react : [];

def cliPath = config.cliPath ?: "node_modules/react-native/local-cli/cli.js"
def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
def entryFile = config.entryFile ?: "index.android.js"
def bundleCommand = config.bundleCommand ?: "bundle"

其中cliPath就是问题的关键,用到他的代码在下面:

def currentBundleTask = tasks.create(
            name: "bundle${targetName}JsAndAssets",
            type: Exec) {
            group = "react"
            description = "bundle JS and assets for ${targetName}."
 ···省略···

            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                commandLine("cmd", "/c", *nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
                    "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
            } else {
                commandLine(*nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
                    "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
            }
···省略···
            }

可以看到,errorlog里报错的gradle任bundleStageReleaseJsAndAssets,就是源码中的任务bundle${targetName}JsAndAssets,所以设置正确的cliPath就可以解决了。

设置方法:
RN项目中的app的build.gradle中有一段
project.ext.react = [
entryFile: “index.js”,
]
在这里添加正确的cliPath就可以了,例如
project.ext.react = [
entryFile: “index.js”,
cliPath: “…/xxxx/node_modules/react-native/local-cli/cli.js”
]
谢谢阅读

你可能感兴趣的:(RN研究,安卓编译问题)