如何在复合构建中解决 Spotless 任务

在使用 Spotless 的时候,我习惯直接在根路径运行 spotlessApply,在 IDEA 里运行的命令是 gradle spotlessApply。而我现在在项目中使用 composite build。我再在根目录运行 :composeiteBuild:spotlessApply 并不会格式化我 composite build 项目中的代码。表面原因是我刻意配置了 target("src/**/*.kt") 限定了格式化代码的范围使得格式化不生效,深层原因是 composite build 中子模块的 tasks 不会被根项目运行。于是如文档所说需要配置 tasks,让根项目的 task 依赖 composite build 的 tasks。但如文档中的配置方式会产生问题。What if 其中一个 composite build 并没有对应名称的 task 呢?于是,这就是这篇文章诞生的初衷。

首先我们先看看官方文档是如何配置的:

1
2
3
tasks.register("publishDeps") {
dependsOn(gradle.includedBuilds.map { it.task(":publishMavenPublicationToMavenRepository") })
}

这种方式的问题是,他们默认每个 composite build 都有一个 publishMavenPublicationToMavenRepository 的 task。但是,如果你的 composite build 没有这个 task,那么这个配置就会报错。

起初,我被官方的文档误导的很深。为什么是在父 build.gradle.kts 中配置复合构建的 task 呢。为何不反过来,就这么灵机一动下,我完美的解决了这个问题。

完整的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
plugins {
id("com.diffplug.spotless")
}

allprojects {
apply<SpotlessPlugin>()
spotless {
kotlin {
target("src/**/*.kt")
ktlint()
}
}
}

subprojects {
rootProject.tasks {
spotlessApply.dependsOn(this@subprojects.tasks.spotlessApply)
spotlessCheck.dependsOn(this@subprojects.tasks.spotlessCheck)
}
}