Gradle多模块项目如何用单条命令发布所有子项目,能否自定义任务?
直接使用内置命令实现单条发布
你无需额外配置,直接在项目根目录执行以下命令即可一次性发布所有子项目:
- 发布到你配置的远端Maven仓库:
./gradlew publish(Windows系统使用gradlew.bat publish) - 发布到本地Maven仓库:
./gradlew publishToMavenLocal(Windows系统使用gradlew.bat publishToMavenLocal)
原理是maven-publish插件会为每个配置了发布规则的子项目自动生成同名的publish任务,在根目录执行该任务时Gradle会自动聚合执行所有子项目的对应发布任务。
自定义任务实现发布需求
完全支持自定义任务,你可以在根项目的build.gradle.kts中添加如下配置,创建专属的聚合发布任务:
tasks.register("publishAllSubprojects") { // 任务归类到publishing分组,方便在任务列表中查找 group = "publishing" description = "聚合发布所有子项目到配置的Maven远端仓库" // 依赖所有子项目的publish任务 dependsOn(subprojects.map { sub -> sub.tasks.named("publish") }) }
如果需要自定义发布到本地Maven的任务,只需要将依赖的任务改为publishToMavenLocal即可:
tasks.register("publishAllToMavenLocal") { group = "publishing" description = "聚合发布所有子项目到本地Maven仓库" dependsOn(subprojects.map { sub -> sub.tasks.named("publishToMavenLocal") }) }
如果有部分子项目不需要参与发布,也可以添加过滤规则,比如跳过名称包含test的子项目:
dependsOn(subprojects .filter { !it.name.contains("test") } .map { sub -> sub.tasks.named("publish") } )
注意事项
请确认你的subprojects配置块中已经提前应用了maven-publish插件,否则子项目会找不到发布任务:
subprojects { // 必须先应用maven-publish插件,后续的publishing配置才会生效 apply(plugin = "maven-publish") // 你原来的publishing配置块 publishing { publications.create<MavenPublication>("mavenJava") { val subprojectJarName = tasks.jar.get().archiveBaseName.get() artifactId = if (subprojectJarName == "vader") "vader" else "vader-$subprojectJarName" from(components["java"]) pom { name.set(artifactId) } } } }
内容的提问来源于stack exchange,提问作者Gopal S Akshintala
相关产品推荐
相关产品推荐

