【发布时间】:2017-06-26 07:51:19
【问题描述】:
我有一个非常典型的 Gradle 库项目,其中包含一组依赖于一些常见配置的模块(Android 或纯 Java)。
这个通用配置被抽象成一个“publishConfig.gradle”文件(通过apply在需要它的那些build.gradle文件中读取)和一些在buildSrc中捕获的自定义任务。这个问题是关于后者的。
buildSrc 是单个模块/项目,由特定包中的源(作为 Groovy)组成,作为具有两个类的单个 Groovy 文件:实现 Plugin 的类和插件扩展类。 例如:
org.clvrmnky.gradle.plugins.LibraryPlugin
此配置和定义的任务可以正常工作。没问题。
现在,出于不同的原因,我想添加额外的自定义任务(请记住,这是根项目中越来越多的子模块共享自定义配置的一部分),因此我添加了一个定义新插件的并行类文件实现Plugin 的类。 例如:
org.clvrmnky.gradle.plugins.BuildBreaker
作为参考,这里是类和任务定义sn-p:
[...]
public class BuildBreaker implements Plugin<Project> {
static def authString = fetchSonarAuthString()
@Override
void apply(Project project) {
project.extensions.create("buildbreaker", BuildBreakerExtension)
project.task([
description: 'Fail this task if the Sonarqube Quality Gate does not pass.',
dependsOn: ["sonarqube"]
], 'breakOnBadQualityGate') {
[...]
即类和任务方法定义类似,但String标识符不同。
但是,当我这样做时,我定义的新任务对根项目或项目的任何子模块都不可见:
PS C:\rd\SOPLibs\Commons> .\gradlew.bat breakOnBadQualityGate
:buildSrc:compileJava UP-TO-DATE
:buildSrc:compileGroovy UP-TO-DATE
[...]
FAILURE: Build failed with an exception.
* What went wrong:
Task 'breakOnBadQualityGate' not found in root project 'Commons'.
* Try:
Run gradlew tasks to get a list of available tasks. Run with --stacktrace option
to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
build 目录包含所有源代码的类,并且有一个包含这些类的 lib jar,我假设在运行时将这些类提供给 Gradle 类路径。也就是说,这是在构建和打包时没有错误。
我已经看到一些提示,您需要在多项目 buildSrc 项目上调整 buildSrc build.gradle,以便所有 jar 在运行时都位于类路径中,但在这种情况下,我们有一个包含多个插件任务的 jarfile。
我也尝试将 BuildBreaker 类移到单独的包中,但这并没有解决问题。
我们能否在单个 buildSrc 中实现多个 Plugin 类,即使它们有不同的类名?还是我必须将它们拆分为多个 buildSrc 项目?
【问题讨论】:
标签: gradle gradle-plugin