摘自 Gradle 文档:复合构建只是包含其他构建的构建. 在许多方面,复合构建类似于 Gradle 多项目构建,不同之处在于,它包括完整的 builds ,而不是包含单个 projects
- 组合通常独立开发的构建,例如,在应用程序使用的库中尝试错误修复时
- 将大型的多项目构建分解为更小,更孤立的块,可以根据需要独立或一起工作
1、创建plugin module,这里我们命名为 buildPlugin
2、删除无用文件,留下build.gradle和main
3、修改build.gradle,粘贴如下代码
buildscript{repositories{// google() mavenCentral() } dependencies{// 因为使用的 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 引用这个插件 id ='com.lans.buildplugin'// 实现这个插件的类的路径 implementationClass ='com.lans.buildplugin.VersionPlugin' } } }4、创建VersionPlugin类
packagecom.lans.buildpluginimportorg.gradle.api.Pluginimportorg.gradle.api.ProjectclassVersionPlugin : Plugin<Project>{overridefunapply(p0:Project){} }!!!注:package com.lans.buildplugin 一定要写、一定要写、一定要写,重要的事说三遍
5、新建BuildManager.kt或者DepManager.kt,名字随意取,定义你想要的变量
object BuildManager{constval applicationId ="com.lans.myplugin"constval compileSdkVersion =33constval minSdkVersion =21constval targetSdkVersion =33constval versionCode =1constval versionName ="1.0.0" }object DepManager{/** * 依赖版本*/privateconstval core_ktx_version ="1.7.0"privateconstval appcompat_version ="1.5.1"privateconstval material_version ="1.6.1"privateconstval constraintlayout_version ="2.1.4"constval core ="androidx.core:core-ktx:$core_ktx_version"constval appcompat ="androidx.appcompat:appcompat:$appcompat_version"constval material ="com.google.android.material:material:$material_version"constval constraintlayout ="androidx.constraintlayout:constraintlayout:$constraintlayout_version" }6、在项目 settings.gradle 文件内添加 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,需要导包importcom.lans.buildplugin.* plugins{id 'com.android.application' id 'org.jetbrains.kotlin.android'//导入自定义插件 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 }1.使用groovy ext的方式,无法跟踪依赖关系,可读性差,不便维护
2.使用Kotlin + BuildSrc,支持双向跟踪,依赖更新时会重新构建整个项目
3.使用Composing builds,支持单向跟踪,依赖更新时不会构建整个项目