1、Gradle Composing builds 是啥?
摘自 Gradle 文檔:復(fù)合構(gòu)建只是包含其他構(gòu)建的構(gòu)建. 在許多方面,復(fù)合構(gòu)建類似于 Gradle 多項(xiàng)目構(gòu)建,不同之處在于,它包括完整的 builds ,而不是包含單個(gè) projects
- 組合通常獨(dú)立開發(fā)的構(gòu)建,例如,在應(yīng)用程序使用的庫(kù)中嘗試錯(cuò)誤修復(fù)時(shí)
- 將大型的多項(xiàng)目構(gòu)建分解為更小,更孤立的塊,可以根據(jù)需要獨(dú)立或一起工作
2、Gradle Composing builds 怎么用
1、創(chuàng)建plugin module,這里我們命名為 buildPlugin
2、刪除無用文件,留下build.gradle和main
3、修改build.gradle,粘貼如下代碼
buildscript {
repositories {
// google()
mavenCentral()
}
dependencies {
// 因?yàn)槭褂玫?Kotlin 需要需要添加 Kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
}
}
apply {
plugin 'kotlin'
plugin 'java-gradle-plugin'
}
repositories {
// google()
mavenCentral()
}
dependencies {
implementation gradleApi()
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
gradlePlugin {
plugins {
version {
// 在 app 模塊需要通過 id 引用這個(gè)插件
id = 'com.lans.buildplugin'
// 實(shí)現(xiàn)這個(gè)插件的類的路徑
implementationClass = 'com.lans.buildplugin.VersionPlugin'
}
}
}
4、創(chuàng)建VersionPlugin類
package com.lans.buildplugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class VersionPlugin : Plugin<Project> {
override fun apply(p0: Project) {
}
}
!!!注:package com.lans.buildplugin 一定要寫、一定要寫、一定要寫,重要的事說三遍
5、新建BuildManager.kt或者DepManager.kt,名字隨意取,定義你想要的變量
object BuildManager {
const val applicationId = "com.lans.myplugin"
const val compileSdkVersion = 33
const val minSdkVersion = 21
const val targetSdkVersion = 33
const val versionCode = 1
const val versionName = "1.0.0"
}
object DepManager {
/**
* 依賴版本
*/
private const val core_ktx_version = "1.7.0"
private const val appcompat_version = "1.5.1"
private const val material_version = "1.6.1"
private const val constraintlayout_version = "2.1.4"
const val core = "androidx.core:core-ktx:$core_ktx_version"
const val appcompat = "androidx.appcompat:appcompat:$appcompat_version"
const val material = "com.google.android.material:material:$material_version"
const val constraintlayout =
"androidx.constraintlayout:constraintlayout:$constraintlayout_version"
}
6、在項(xiàng)目 settings.gradle 文件內(nèi)添加 includeBuild("buildPlugin") ,不是include !!!
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "buildConfig"
include ':app'
includeBuild("buildPlugin")
7、在app或module的 build.gradle 中使用 buildPlugin
//這里使用了BuildManager和DepManager,需要導(dǎo)包
import com.lans.buildplugin.*
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
//導(dǎo)入自定義插件
id 'com.lans.buildplugin'
}
android {
namespace 'com.lans.myplugin'
compileSdk BuildManager.compileSdkVersion
defaultConfig {
applicationId BuildManager.applicationId
minSdk BuildManager.minSdkVersion
targetSdk BuildManager.targetSdkVersion
versionCode BuildManager.versionCode
versionName BuildManager.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation DepManager.core
implementation DepManager.appcompat
implementation DepManager.material
implementation DepManager.constraintlayout
}
總結(jié)
1.使用groovy ext的方式,無法跟蹤依賴關(guān)系,可讀性差,不便維護(hù)
2.使用Kotlin + BuildSrc,支持雙向跟蹤,依賴更新時(shí)會(huì)重新構(gòu)建整個(gè)項(xiàng)目
3.使用Composing builds,支持單向跟蹤,依賴更新時(shí)不會(huì)構(gòu)建整個(gè)項(xiàng)目