Gradle Kotlin Versioning ❤ Composing Builds > BuildSrc 筆記
自從為了就是自動補全(auto-completion)的功能,我們開始使用 BuildSrc ,讓其他 gradle project 自動帶入識別 BuildSrc 底下的定義們:
buildSrc/src/main/java/Ext.kt
object Version {
const val kotlinxCoroutines = "1.5.0"
const val junit = "4.12"
const val truth = "1.1.3"
const val mockitoKotlin = "3.2.0"
const val robolectric = "4.5.1"
}object Depends {
const val kotlinxCoroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.kotlinxCoroutines}"
const val kotlinxCoroutinesCoreTest = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Version.kotlinxCoroutines}"
const val junit = "junit:junit:${Version.junit}"
const val truth = "com.google.truth:truth:${Version.truth}"
const val mockitoKotlin = "org.mockito.kotlin:mockito-kotlin:${Version.mockitoKotlin}"
const val robolectric = "org.robolectric:robolectric:${Version.robolectric}"
}
Gradle 文件提到:
A change in
buildSrc
causes the whole project to become out-of-date. Thus, when making small incremental changes, the--no-rebuild
command-line option is often helpful to get faster feedback. Remember to run a full build regularly or at least when you’re done, though.
BuildSrc 一旦修改,整個 project 都會重新建構。
那如果我們把 BuildSrc Ext.kt 轉成獨立 Gradle Plugin Module,那麼每個變動只會重新建構該 Module ,這樣效能比較好。
我們有個最簡單的 Local Gradle Plugin 模式:Composing Builds:
第 1 步,將 buildSrc/
更名成 version-gradle/
(版號 Gradle Plugin 的意思),Ext.kt
改成 version.gradle.VersionGradle.kt
:
+ package version.gradle
+ import org.gradle.api.Plugin
+ import org.gradle.api.Project
+ class VersionGradle : Plugin<Project> {
+ override fun apply(project: Project) {
+ }
+ }
object Version {
// ...
}
object Depends {
// ...
}
第 2 步,/settings.gradle.kts
增加一行:
rootProject.name = "aws-ktx"
+ includeBuild("version-gradle")
第 3 步,version-gradle/build.gradle.kts
:
plugins {
`kotlin-dsl`
`java-gradle-plugin`
}
repositories {
mavenCentral()
}
gradlePlugin {
plugins {
create("version.gradle") {
id = "version.gradle"
implementationClass = "version.gradle.VersionGradle"
}
}
}
最後第 4 步,讓所有 modules 都認得 version.gradle plugin:
/build.gradle.kts
buildscript {
// ...
}+ plugins {
+ id("version.gradle")
+ }
所有 modules 都加:
*-other-modules/build.gradle.kts
+ import version.gradle.* // ... dependencies {
// ...
testImplementation(Depends.junit)
testImplementation(Depends.truth)
That’s it.
版號統一管理方案,目前已知有:
- Ext 方案 (無法自動補全):
buildscript { ext.xxxx = "" }
- build.gradle.kts + buildSrc 方案
- builld.gradle.kts + composing builds 方案 (效能較好,獨立 module 刷新)
可參考實際運作的專案: