【问题标题】:react-native\react.gradle' does not existreact-native\react.gradle' 不存在
【发布时间】:2017-11-10 06:38:53
【问题描述】:

我使用 react native 创建了一个应用程序,我正在尝试生成 apk。在http://facebook.github.io/react-native/docs/signed-apk-android.html#content 的文档中做了任何事情之后。发生错误,它说 无法读取脚本 react-native\react.gradle',因为它不存在。

这是错误

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\User\Desktop\Aaa\android\app\build.gradle' line: 68

* What went wrong:
A problem occurred evaluating project ':app'.
> Could not read script 'C



*   // override which node gets called and with what additional arguments
*   nodeExecutableAndArgs: ["node"],
*
*   // supply additional arguments to the packager
*   extraPackagerArgs: []
* ]
*/

apply from: "../../node_modules/react-native/react.gradle"

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

【问题讨论】:

  • 你能把你的 gradle 配置粘贴到 android/app/build.gradle 吗?
  • 一切@max23_?
  • 可能从第 60 行到第 70 行? (因为它在第 68 行抱怨)
  • 发布了错误先生

标签: react-native


【解决方案1】:

进入项目的根目录并运行npm install,它将生成必要的文件,包括react.gradle

如果没有node.js,可以从这里下载:https://nodejs.org/en/download/

【讨论】:

    【解决方案2】:

    你可以 npm 安装

    所有的问题都结束了。

    【讨论】:

    • 这个答案太宽泛了......它并没有解决为什么 react.gradle 无法读取的问题。
    • Herwindra,我已经运行“npm install”,但在我的情况下,问题仍然存在......当我运行“react-native run-android”时,一条消息说不识别“run-android” "并且我必须运行"npm install"。所以我不明白 kkkkk
    • 没有得到解决方案。
    【解决方案3】:

    React.gradle 文件将此文件添加到react modules,然后运行您的项目,它将解决您的问题。这是官方react-native/react.gradle

    如果发生任何错误,请告诉我。

    
    /*
     * Copyright (c) Facebook, Inc. and its affiliates.
     *
     * This source code is licensed under the MIT license found in the
     * LICENSE file in the root directory of this source tree.
     */
    
    import org.apache.tools.ant.taskdefs.condition.Os
    
    def config = project.hasProperty("react") ? project.react : [:];
    
    def detectEntryFile(config) {
        if (System.getenv('ENTRY_FILE')) {
            return System.getenv('ENTRY_FILE')
        } else if (config.entryFile) {
            return config.entryFile
        } else if ((new File("${projectDir}/../../index.android.js")).exists()) {
            return "index.android.js"
        }
    
        return "index.js";
    }
    
    def cliPath = config.cliPath ?: "node_modules/react-native/cli.js"
    def composeSourceMapsPath = config.composeSourceMapsPath ?: "node_modules/react-native/scripts/compose-source-maps.js"
    def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
    def entryFile = detectEntryFile(config)
    def bundleCommand = config.bundleCommand ?: "bundle"
    def reactRoot = file(config.root ?: "../../")
    def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
    def bundleConfig = config.bundleConfig ? "${reactRoot}/${config.bundleConfig}" : null ;
    def enableVmCleanup = config.enableVmCleanup == null ? true : config.enableVmCleanup
    def hermesCommand = config.hermesCommand ?: "../../node_modules/hermes-engine/%OS-BIN%/hermes"
    
    def reactNativeDevServerPort() {
        def value = project.getProperties().get("reactNativeDevServerPort")
        return value != null ? value : "8081"
    }
    
    def reactNativeInspectorProxyPort() {
        def value = project.getProperties().get("reactNativeInspectorProxyPort")
        return value != null ? value : reactNativeDevServerPort()
    }
    
    def getHermesOSBin() {
        if (Os.isFamily(Os.FAMILY_WINDOWS)) return "win64-bin";
        if (Os.isFamily(Os.FAMILY_MAC)) return "osx-bin";
        if (Os.isOs(null, "linux", "amd64", null)) return "linux64-bin";
        throw new Exception("OS not recognized. Please set project.ext.react.hermesCommand " +
                            "to the path of a working Hermes compiler.");
    }
    
    // Make sure not to inspect the Hermes config unless we need it,
    // to avoid breaking any JSC-only setups.
    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);
    }
    
    // Set enableHermesForVariant to a function to configure per variant,
    // or set `enableHermes` to True/False to set all of them
    def enableHermesForVariant = config.enableHermesForVariant ?: {
        def variant -> config.enableHermes ?: false
    }
    
    android {
        buildTypes.all {
            resValue "integer", "react_native_dev_server_port", reactNativeDevServerPort()
            resValue "integer", "react_native_inspector_proxy_port", reactNativeInspectorProxyPort()
        }
    }
    
    afterEvaluate {
        def isAndroidLibrary = plugins.hasPlugin("com.android.library")
        def variants = isAndroidLibrary ? android.libraryVariants : android.applicationVariants
        variants.all { def variant ->
            // Create variant and target names
            def targetName = variant.name.capitalize()
            def targetPath = variant.dirName
    
            // React js bundle directories
            def jsBundleDir = file("$buildDir/generated/assets/react/${targetPath}")
            def resourcesDir = file("$buildDir/generated/res/react/${targetPath}")
    
            def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
            def jsSourceMapsDir = file("$buildDir/generated/sourcemaps/react/${targetPath}")
            def jsIntermediateSourceMapsDir = file("$buildDir/intermediates/sourcemaps/react/${targetPath}")
            def jsPackagerSourceMapFile = file("$jsIntermediateSourceMapsDir/${bundleAssetName}.packager.map")
            def jsCompilerSourceMapFile = file("$jsIntermediateSourceMapsDir/${bundleAssetName}.compiler.map")
            def jsOutputSourceMapFile = file("$jsSourceMapsDir/${bundleAssetName}.map")
    
            // Additional node and packager commandline arguments
            def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
            def extraPackagerArgs = config.extraPackagerArgs ?: []
            def npx = Os.isFamily(Os.FAMILY_WINDOWS) ? "npx.cmd" : "npx"
    
            def execCommand = []
    
            if (config.cliPath || config.nodeExecutableAndArgs) {
                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                    execCommand.addAll(["cmd", "/c", *nodeExecutableAndArgs, cliPath])
                } else {
                    execCommand.addAll([*nodeExecutableAndArgs, cliPath])
                }
            } else {
                execCommand.addAll([npx, "react-native"])
            }
    
            def enableHermes = enableHermesForVariant(variant)
    
            def currentBundleTask = tasks.create(
                name: "bundle${targetName}JsAndAssets",
                type: Exec) {
                group = "react"
                description = "bundle JS and assets for ${targetName}."
    
                // Create dirs if they are not there (e.g. the "clean" task just ran)
                doFirst {
                    jsBundleDir.deleteDir()
                    jsBundleDir.mkdirs()
                    resourcesDir.deleteDir()
                    resourcesDir.mkdirs()
                    jsIntermediateSourceMapsDir.deleteDir()
                    jsIntermediateSourceMapsDir.mkdirs()
                    jsSourceMapsDir.deleteDir()
                    jsSourceMapsDir.mkdirs()
                }
    
                // Set up inputs and outputs so gradle can cache the result
                inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
                outputs.dir(jsBundleDir)
                outputs.dir(resourcesDir)
    
                // Set up the call to the react-native cli
                workingDir(reactRoot)
    
                // Set up dev mode
                def devEnabled = !(config."devDisabledIn${targetName}"
                    || targetName.toLowerCase().contains("release"))
    
                def extraArgs = extraPackagerArgs;
    
                if (bundleConfig) {
                    extraArgs = extraArgs.clone()
                    extraArgs.add("--config");
                    extraArgs.add(bundleConfig);
                }
    
                commandLine(*execCommand, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
                    "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir,
                    "--sourcemap-output", enableHermes ? jsPackagerSourceMapFile : jsOutputSourceMapFile, *extraArgs)
    
    
                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)
                                }
                            }
                        }
                    }
                }
    
                enabled config."bundleIn${targetName}" != null
                    ? config."bundleIn${targetName}"
                    : config."bundleIn${variant.buildType.name.capitalize()}" != null
                        ? config."bundleIn${variant.buildType.name.capitalize()}"
                        : targetName.toLowerCase().contains("release")
            }
    
            // Expose a minimal interface on the application variant and the task itself:
            variant.ext.bundleJsAndAssets = currentBundleTask
            currentBundleTask.ext.generatedResFolders = files(resourcesDir).builtBy(currentBundleTask)
            currentBundleTask.ext.generatedAssetsFolders = files(jsBundleDir).builtBy(currentBundleTask)
    
            // registerGeneratedResFolders for Android plugin 3.x
            if (variant.respondsTo("registerGeneratedResFolders")) {
                variant.registerGeneratedResFolders(currentBundleTask.generatedResFolders)
            } else {
                variant.registerResGeneratingTask(currentBundleTask)
            }
            variant.mergeResourcesProvider.get().dependsOn(currentBundleTask)
    
            // packageApplication for Android plugin 3.x
            def packageTask = variant.hasProperty("packageApplication")
                ? variant.packageApplicationProvider.get()
                : tasks.findByName("package${targetName}")
            if (variant.hasProperty("packageLibrary")) {
                packageTask = variant.packageLibrary
            }
    
            // pre bundle build task for Android plugin 3.2+
            def buildPreBundleTask = tasks.findByName("build${targetName}PreBundle")
    
            def resourcesDirConfigValue = config."resourcesDir${targetName}"
            if (resourcesDirConfigValue) {
                def currentCopyResTask = tasks.create(
                    name: "copy${targetName}BundledResources",
                    type: Copy) {
                    group = "react"
                    description = "copy bundled resources into custom location for ${targetName}."
    
                    from(resourcesDir)
                    into(file(resourcesDirConfigValue))
    
                    dependsOn(currentBundleTask)
    
                    enabled(currentBundleTask.enabled)
                }
    
                packageTask.dependsOn(currentCopyResTask)
                if (buildPreBundleTask != null) {
                    buildPreBundleTask.dependsOn(currentCopyResTask)
                }
            }
    
            def currentAssetsCopyTask = tasks.create(
                name: "copy${targetName}BundledJs",
                type: Copy) {
                group = "react"
                description = "copy bundled JS into ${targetName}."
    
                if (config."jsBundleDir${targetName}") {
                    from(jsBundleDir)
                    into(file(config."jsBundleDir${targetName}"))
                } else {
                    into ("$buildDir/intermediates")
                    into ("assets/${targetPath}") {
                        from(jsBundleDir)
                    }
    
                    // Workaround for Android Gradle Plugin 3.2+ new asset directory
                    into ("merged_assets/${variant.name}/merge${targetName}Assets/out") {
                        from(jsBundleDir)
                    }
    
                    // Workaround for Android Gradle Plugin 3.4+ new asset directory
                    into ("merged_assets/${variant.name}/out") {
                        from(jsBundleDir)
                    }
                }
    
                // mergeAssets must run first, as it clears the intermediates directory
                dependsOn(variant.mergeAssetsProvider.get())
    
                enabled(currentBundleTask.enabled)
            }
    
            packageTask.dependsOn(currentAssetsCopyTask)
            if (buildPreBundleTask != null) {
                buildPreBundleTask.dependsOn(currentAssetsCopyTask)
            }
    
            // Delete the VM related libraries that this build doesn't need.
            // The application can manage this manually by setting 'enableVmCleanup: false'
            //
            // This should really be done by packaging all Hermes releated libs into
            // two separate HermesDebug and HermesRelease AARs, but until then we'll
            // kludge it by deleting the .so files out of the /transforms/ directory.
            def isRelease = targetName.toLowerCase().contains("release")
            def libDir = "$buildDir/intermediates/transforms/"
            def vmSelectionAction = {
                fileTree(libDir).matching {
                    if (enableHermes) {
                        // For Hermes, delete all the libjsc* files
                        include "**/libjsc*.so"
    
                        if (isRelease) {
                            // Reduce size by deleting the debugger/inspector
                            include '**/libhermes-inspector.so'
                            include '**/libhermes-executor-debug.so'
                        } else {
                            // Release libs take precedence and must be removed
                            // to allow debugging
                            include '**/libhermes-executor-release.so'
                        }
                    } else {
                        // For JSC, delete all the libhermes* files
                        include "**/libhermes*.so"
                    }
                }.visit { details ->
                    def targetVariant = ".*/transforms/[^/]*/${targetPath}/.*"
                    def path = details.file.getAbsolutePath().replace(File.separatorChar, '/' as char)
                    if (path.matches(targetVariant) && details.file.isFile()) {
                        details.file.delete()
                    }
                }
            }
    
            if (enableVmCleanup) {
                def task = tasks.findByName("package${targetName}")
                task.doFirst(vmSelectionAction)
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这意味着您的项目目录中没有节点模块。请执行 yarn install 或 npm install 来创建节点模块,然后在 android studio 中运行应用程序。

      【讨论】:

      • 在回答问题之前,我建议通读现有答案。这篇文章的最佳答案(三年前)推荐了同样的东西,但有一些额外的细节。您的答案可能是正确的,但除了现有答案之外,它没有任何贡献。
      • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
      • @lordhog:它确实提供了答案。它建议运行例如npm install。这是一个多余的答案,但它仍然是一个答案
      【解决方案5】:

      我意识到这是一个老问题,但我今天遇到了这个问题,我希望这有助于防止其他人拔头发。

      我正在使用 yarn 工作区,这会导致 node_modules 安装在工作区根目录(比它们通常所在的位置高一级。) 这对于项目的节点/打字稿部分来说不是问题。 但是,由于 gradle also 引用了节点模块内的文件,所以它会感到困惑并放弃。

      到目前为止,我只在 Windows 上遇到过这种情况。

      【讨论】:

      • 您找到解决方案了吗?
      • 我的决定是使用 Lerna 而不是 Yarn Workspaces。
      【解决方案6】:

      单独使用 npm install 是不行的。

      你应该为 android 运行:

      npm i @react-native-community/cli-platform-android
      

      然后:

      npm install 
      

      我以管理员身份运行此程序并为我解决了问题。

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 2016-01-07
        • 2017-08-14
        • 2017-10-20
        • 1970-01-01
        相关资源
        最近更新 更多