首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分级buildSrc和buildscript

分级buildSrc和buildscript
EN

Stack Overflow用户
提问于 2017-12-05 00:43:20
回答 2查看 3.8K关注 0票数 11

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

代码语言:javascript
复制
buildscript {
    repositories {
        google()
    }
    dependencies {
       classpath "com.android.tools.build:gradle:$gToolsVersion"
    }
}

然而,这意味着用户要应用这个插件,他们必须(1)应用我们的插件和(2)添加buildscript样板。似乎没必要这么做。我们也可以在插件中添加一个project.buildscript块,但这似乎也是不必要的,而且,由于这个bug,issues也是有问题的。

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

那么,问题是:

  1. buildSrc/build.gradle中指定的buildSrc/build.gradle依赖项与在常规build.gradle中的buildscript块中指定的classpath依赖项之间有什么区别?
  2. 我如何安排事情,使用户可以应用从buildSrc插件,而不必也添加buildscript块到他们的build.gradle
EN

回答 2

Stack Overflow用户

发布于 2018-06-18 13:26:22

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

项目根目录中的repositories.gradle

代码语言:javascript
复制
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

代码语言:javascript
复制
buildscript {
    apply from: '../repositories.gradle'
}

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

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

build.gradle

代码语言:javascript
复制
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块的buildscript块中的build.gradle依赖项。implementation依赖项在repositories.gradle中似乎自动应用。

当通过依赖关系提供build.gradle时,我的解决方案可能无法工作。

票数 3
EN

Stack Overflow用户

发布于 2018-09-06 02:23:57

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

我已经成功地将buildSrc/build.gradle用作定义依赖关系的地方,这些依赖关系通常属于根项目的buildscript类路径,用于我的一些项目。

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

我以前使用compile依赖,但只是切换到runtimeClasspath,这感觉更合适,也可以工作。我认为您的classpath依赖项不起作用,因为它们在buildSrc项目的类路径上,但没有编译到或沿着它运行。

如果你决定走这条路,你可能会遇到我刚刚发现的问题,而这个问题正是因为这种方法才出现的。

当我用dokka插件尝试这种方法时,我得到了以下错误

代码语言:javascript
复制
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来解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47644319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档