Android Gradle 为什么我们需要“allprojects”?

A.A*_*omi 5 android gradle android-gradle-plugin

当我尝试将 Gson 添加到我现有的 Android gradle 项目时遇到了一个问题。

例外是这样的

“无法解析:com.google.code.gson:gson:2.3.1”

我的 build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}


apply plugin: 'android'

dependencies {
    compile 'com.google.code.gson:gson:2.3.1'
.
.
Run Code Online (Sandbox Code Playgroud)

经过一些搜索和反复试验,我发现您需要添加以下内容来解决问题:

allprojects {
    repositories {
        jcenter()
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我们需要两次引用 jcenter,为什么“allprojects”对解决这个问题很重要?

Com*_*are 6

经过一些搜索和跟踪和错误,我发现您需要添加以下内容来解决问题

仅当您有一个传统的 Android Studio 项目时,您将应用程序划分为多个模块(例如,app/)。真正需要的是模块知道从哪里提取依赖项。

为什么我们需要两次引用jcenter

repositories你的封buildscript封说:“这些都是从拉摇篮插件和其他人工制品仓库dependencies为上市buildscript关闭本身”。

repositories你已经在封allprojects封说:“这些都是从拉你自己的应用程序中的工件储存器dependencies”。

在传统的 Android Studio 项目中,allprojects闭包build.gradle位于项目根目录中的文件中。allprojects说“这个闭包中的所有内容,请应用到这个项目中所有模块的 Gradle 配置,比如app/那边的那个模块”。

现在,您build.gradle问题中的代码段暗示您可能没有传统的 Android Studio 项目,而是有一个没有app/模块且只有一个build.gradle文件的项目。在这种情况下,allprojects它本身不是必需的(因为没有模块),但您仍然需要指定它们是什么repositories

例如,这是一个build.gradle来自无模块项目的文件:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
    maven {
        url "https://repo.commonsware.com.s3.amazonaws.com"
    }
}

dependencies {
    compile 'de.greenrobot:eventbus:2.4.0'
    compile 'com.android.support:support-v13:21.0.3'
    compile 'com.commonsware.cwac:wakeful:1.0.+'
}

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.2"

        defaultConfig {
            targetSdkVersion 17
        }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,除了repositories里面的闭包buildscript(定义插件来自哪里)之外,我还有一个顶级repositories闭包,来定义顶级dependencies来自哪里。