首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置子项目后,从Gradle约定插件注册任务

配置子项目后,从Gradle约定插件注册任务
EN

Stack Overflow用户
提问于 2022-08-25 00:38:13
回答 1查看 87关注 0票数 0

我有一个具有多个独立项目的单一项目。

代码语言:javascript
复制
├── first-app
│   ├── adapters
│   ├── application
│   ├── build.gradle.kts
│   ├── public-events
│   ├── settings.gradle.kts
│   └── spring-boot-configuration
├── second-app
│   ├── adapters
│   ├── application
│   ├── build.gradle.kts
│   ├── settings.gradle.kts
│   └── spring-boot-configuration
├── build-conventions
│   ├── build.gradle.kts
│   ├── settings.gradle.kts
│   └── src/...

现在,我尝试通过将其提取到约定插件(到build-conventions独立项目,该项目通过includeBuild("../build-conventions")链接到每个应用程序)来共享一些常见的构建逻辑。

我在每个独立项目的根build.gradle.kts ((first|second)-app)中重复了以下代码:

代码语言:javascript
复制
plugins {
    id("jacoco-report-aggregation")
}

reporting {
    reports {
        @Suppress("UnstableApiUsage")
        val jacocoRootReport by registering(JacocoCoverageReport::class) {
            testType.set(TestSuiteType.UNIT_TEST)
            dependencies {
                project.subprojects
                    .filter { it.plugins.findPlugin("jacoco") != null }
                    .forEach { jacocoAggregation(it) }
            }
        }
    }
}

如您所见,jacocoRootReport任务的注册还将每个具有jacoco插件的子模块添加到jacocoAggregation依赖项列表中(为了知道要检查哪个子项目以收集jacocoAggregation报告,jacocoRootReport任务需要这样做)。

上面的配置按照预期工作,直到我将jacoco聚合任务配置提取到常规插件jacoco-root-report-convention.gradle.kts中为止。

代码语言:javascript
复制
plugins {
    id("jacoco-report-aggregation")
}

reporting {
    reports {
        @Suppress("UnstableApiUsage")
        val jacocoRootReport by registering(JacocoCoverageReport::class) {
            testType.set(TestSuiteType.UNIT_TEST)
            dependencies {
                project.subprojects
                    .filter { it.plugins.findPlugin("jacoco") != null }
                    .forEach { jacocoAggregation(it) }
            }
        }
    }
}

并尝试将其应用于我的项目的根,如下所示:

代码语言:javascript
复制
plugins {
    id("jacoco-root-report-convention")
}

现在没有生成根报告,因为.filter { it.plugins.findPlugin("jacoco") != null }找不到与给定谓词匹配的任何子项目。

问题在于,试图找到jacocoAggregation候选程序的时间早于配置子模块的时间。有办法建立正确的秩序吗?(首先配置子项目,然后执行任务注册代码)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-27 22:46:28

答案是简单地使用jacoco-root-report-convention语法在subprojects-block之后应用apply(plugin = "...")。示例:

代码语言:javascript
复制
plugins {
    id("my-whatever-root-module-convention")
}

subprojects {
    apply(plugin = "base-jvm-project-convention")
    apply(plugin = "dependencies-convention")
}

apply(plugin = "aggregated-reporting-convention") // <--------

在本例中,aggregated-reporting-convention将在配置subprojects之后应用。

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

https://stackoverflow.com/questions/73480744

复制
相关文章

相似问题

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