Gradle buildSrc和buildscript

Oli*_*ain 9 gradle android-gradle-plugin

我们有一个Gradle构建,其中包含buildSrc一些自定义插件.这些插件适用于其他插件.例如,我们的插件适用com.android.tools.build:gradle.对于在编译期间库需要在Gradle的类路径上的注释处理.所以,把它放在我们的主要build.gradle工作中:

buildscript {
    repositories {
        google()
    }
    dependencies {
       classpath "com.android.tools.build:gradle:$gToolsVersion"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这意味着对于用户应用此插件,他们必须(1)应用我们的插件和(2)添加该buildscript样板.似乎这不应该是必要的.我们也可以project.buildscript在我们的插件中添加一个块,但这似乎也是不必要的,由于这个bug是有问题的:https://developer.android.com/studio/build/gradle-plugin-3-0-0.html?utm_source = android-studio#known_issues.

我将com.android.tools.build:gradle依赖项添加buildSrc/build.gradleruntime依赖项.这似乎应该工作:我认为这告诉Gradle为了运行我的插件,库(及其依赖项)需要在类路径上.但是,gradle buildEnvironment(以及我们的构建失败的事实)清楚地表明情况并非如此.

所以,问题:

  1. runtime指定的依赖项buildSrc/build.gradle和常规build.gradle中块中classpath指定的依赖项之间的区别是什么buildscript
  2. 我如何安排你的事情,使用户可以从应用插件buildSrc,并没有要还添加buildscript块到他们build.gradle

sta*_*air 3

我遇到了一个稍微不同的问题,并找到了一个可以接受的解决方案,可能有助于解决您的第二个问题:我想buildSrc/build.gradle在 root 中应用相同的存储库并两次build.gradle

repositories.gradle在项目根目录中:

repositories {
    if (project.hasProperty('nexus')) {
        maven {
            url 'http://localhost:8081/repository/JCenter/'
        }
        maven {
            url 'http://localhost:8081/repository/Maven_Google/'
        }
    } else {
        jcenter()
        google()
    }
}

ext {
    androidGradleBuildToolsDependency = 'com.android.tools.build:gradle:3.1.3'
}
Run Code Online (Sandbox Code Playgroud)

buildSrc/build.gradle:

buildscript {
    apply from: '../repositories.gradle'
}

allprojects {
    apply from: '../repositories.gradle'
}

dependencies {
    // androidGradleBuildToolsDependency is defined in repositories.gradle
    implementation androidGradleBuildToolsDependency
}
Run Code Online (Sandbox Code Playgroud)

build.gradle

buildscript {
    apply from: 'repositories.gradle'
}

allprojects {
    // this line will also be executed from the build.gradles in subprojects, so the working
    // directory isn't always the same, so we use the absolute path here
    apply from: "${rootProject.projectDir}/repositories.gradle"
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要像平常那样需要根块classpath内的依赖项。中的依赖项似乎会自动应用它。buildscriptbuild.gradleimplementationrepositories.gradle

build.gradle当通过依赖项提供 s时,我的解决方案可能不起作用。