如何在子模块开启buildFeatures.compose=true时自动添加Gradle依赖?
这问题我太熟悉了!刚好之前帮团队重构多模块项目时解决过一模一样的痛点——把重复的Compose依赖配置从各个子模块里抽出来,实现「一键开启Compose自动加依赖」的效果。下面给你两种实用方案,按需选择:
方案一:根项目构建脚本快速实现(适合中小项目)
你可以在根目录的构建脚本中通过subprojects块监听所有子模块的配置,当检测到模块开启了buildFeatures.compose = true时,自动注入Compose依赖和必要的配置。
Groovy版(根目录build.gradle)
subprojects { afterEvaluate { project -> // 只处理Android模块(应用或库) if (project.hasProperty('android')) { def android = project.android // 检查是否开启了Compose if (android.buildFeatures.compose) { // 统一管理版本号,建议放到根项目的ext里或者Version Catalog def composeVersion = "1.5.3" def kotlinCompilerExtensionVersion = "1.5.3" dependencies { // 核心Compose依赖 implementation "androidx.compose.ui:ui:$composeVersion" implementation "androidx.compose.material3:material3:$composeVersion" implementation "androidx.compose.ui:ui-tooling-preview:$composeVersion" debugImplementation "androidx.compose.ui:ui-tooling:$composeVersion" // 可选:添加常用的Compose扩展依赖,比如ViewModel集成 implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2" } // 必须设置Kotlin编译器扩展版本,否则编译报错 android.composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion } } } }
Kotlin DSL版(根目录build.gradle.kts)
subprojects { afterEvaluate { // 找到Android模块的扩展配置 extensions.findByType<com.android.build.gradle.BaseExtension>()?.apply { if (buildFeatures.compose) { val composeVersion = "1.5.3" val kotlinCompilerExtensionVersion = "1.5.3" dependencies { implementation("androidx.compose.ui:ui:$composeVersion") implementation("androidx.compose.material3:material3:$composeVersion") implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion") debugImplementation("androidx.compose.ui:ui-tooling:$composeVersion") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") } composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion } } } }
方案二:Gradle约定插件(适合复杂多模块场景,更规范)
如果你的项目模块较多、配置复杂,推荐用Gradle约定插件来封装Compose配置,这种方式更符合Gradle的最佳实践,也便于维护和扩展。
步骤1:创建构建逻辑模块(build-logic)
在项目根目录下创建build-logic目录,用来存放约定插件。
步骤2:编写Compose约定插件
在build-logic/convention/src/main/kotlin/com/yourcompany/ComposeConventionPlugin.kt中编写插件代码:
import com.android.build.gradle.BaseExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies class ComposeConventionPlugin : Plugin<Project> { override fun apply(target: Project) { with(target) { // 只对Android应用和库模块生效 plugins.withId("com.android.application") { configureAndroidExtension() } plugins.withId("com.android.library") { configureAndroidExtension() } } } private fun Project.configureAndroidExtension() { extensions.findByType<BaseExtension>()?.apply { afterEvaluate { if (buildFeatures.compose) { // 推荐用Version Catalog统一管理版本(见下文补充) val composeVersion = "1.5.3" val kotlinCompilerExtensionVersion = "1.5.3" dependencies { implementation("androidx.compose.ui:ui:$composeVersion") implementation("androidx.compose.material3:material3:$composeVersion") implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion") debugImplementation("androidx.compose.ui:ui-tooling:$composeVersion") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") } composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion } } } } }
步骤3:配置插件并应用到项目
按照Gradle约定插件的配置规范,在build-logic的构建脚本中配置插件发布,然后在根项目的settings.gradle.kts中引入build-logic,最后子模块只需开启Compose即可自动获取依赖。
额外优化:用Version Catalog统一管理版本
不管用哪种方案,都推荐用Gradle的Version Catalog(libs.versions.toml)来统一管理所有依赖版本,避免版本分散:
在根目录gradle/libs.versions.toml中添加:
[versions] compose = "1.5.3" kotlinCompilerExtension = "1.5.3" lifecycleViewModelCompose = "2.6.2" [libraries] compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" } compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "compose" } compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose" } compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" } lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewModelCompose" }
之后依赖可以写成implementation(libs.compose.ui)(Kotlin DSL)或implementation libs.compose.ui(Groovy),更清晰且便于统一升级。
注意事项
afterEvaluate的作用:确保子模块的Android配置已经被解析完成,再检查buildFeatures.compose的值,避免读取到默认的false。- 必须设置
kotlinCompilerExtensionVersion:这个版本需要和Compose版本匹配,否则会出现编译错误。 - 按需添加依赖:可以根据项目需求调整自动注入的依赖列表,比如不需要Material3的话换成Material,或者添加Compose Navigation等扩展依赖。
内容的提问来源于stack exchange,提问作者Viacheslav Smityukh

