Gradle buildSrc和buildscript

时间:2017-12-05 00:43:21

标签: gradle android-gradle

我们有一个Gradle版本,其中包含一个带有一些自定义插件的buildSrc。这些插件适用于其他插件。例如,我们的插件适用com.android.tools.build:gradle。对于在编译期间库需要在Gradle的类路径上的注释处理。因此,将它放在我们的主要build.gradle中:

buildscript {
    repositories {
        google()
    }
    dependencies {
       classpath "com.android.tools.build:gradle:$gToolsVersion"
    }
}

然而,这意味着对于用户应用此插件,他们必须(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.gradle作为runtime依赖项。这似乎应该工作:我认为这告诉Gradle为了运行我的插件,库(及其依赖项)需要在类路径上。但是,gradle buildEnvironment(以及我们的构建失败的事实)清楚地表明并非如此。

所以,问题:

  1. runtime中指定的buildSrc/build.gradle依赖项与常规build.gradle中classpath块中指定的buildscript依赖项之间的区别是什么?< / LI>
  2. 如何安排内容以便用户可以应用buildSrc而非的插件,还必须将buildscript块添加到build.gradle?< / LI>

2 个答案:

答案 0 :(得分:2)

我遇到了一个稍微不同的问题,并找到了一个可以接受的解决方案,可能对您的第二个问题有所帮助:我想在buildSrc/build.gradle中应用相同的存储库,在根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'
}

buildSrc/build.gradle

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

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

dependencies {
    // androidGradleBuildToolsDependency is defined in repositories.gradle
    implementation androidGradleBuildToolsDependency
}

Root 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"
}

请注意,您不需要像通常那样在根classpath的{​​{1}}块内部使用buildscript依赖项。 <{1}}中的build.gradle依赖关系似乎会自动应用它。

当通过依赖项提供implementation时,我的解决方案可能无效。

答案 1 :(得分:0)

在研究切线问题时偶然发现了这一点。

我已经成功地使用buildSrc/build.gradle来定义一些项目中通常依赖于根项目的buildscript类路径的依赖项。

您可以在此处看到一个有效的示例:https://github.com/episode6/chop/blob/develop/buildSrc/build.gradle

我曾经使用compile依赖性,但是刚切换到runtimeClasspath,感觉更合适并且也可以。我认为您的classpath依赖项无法正常工作,因为它们将位于buildSrc项目的类路径中,但不会编译到该项目中或在其旁边运行。

如果您决定走这条路,可能会遇到我只是在研究的问题,因为这种方法才出现。

当我使用dokka插件尝试这种方法时,出现以下错误

Could not resolve all files for configuration ':detachedConfiguration1'.
   > Cannot resolve external dependency org.jetbrains.dokka:dokka-fatjar:0.9.17 because no repositories are defined

我可以通过将jcenter()添加到根项目的buildscript存储库中来解决此问题:https://github.com/episode6/chop/blob/develop/build.gradle#L2