Gradle多项目构建中,非根项目Zip任务如何访问项目版本?
在Gradle多项目子项目的Zip任务中正确获取项目版本的方法
核心问题原因
Zip任务本身自带一个version属性,直接在任务闭包里写$version会优先引用任务自身的这个属性(默认是null),而非项目的版本。
解决方法
1. 显式引用项目版本
在Zip任务里用project.version明确指定取当前子项目的版本,避免作用域混淆:
task createZip(type: Zip) { archiveFileName = "my-app-${project.version}.zip" // 补充Zip任务的其他配置,比如指定打包内容 from project.sourceSets.main.output destinationDirectory = file("$buildDir/distributions") }
2. 确保版本配置生效
- 如果版本是根项目统一定义的,检查根项目
build.gradle里的配置是否覆盖到子项目:allprojects { version = "1.0.0" // 全局统一版本 } - 子项目无需重复定义版本,直接通过
project.version即可继承根项目的配置。
3. 延迟配置适配动态版本
如果版本是动态生成的(比如通过插件、脚本计算),用Gradle的延迟加载机制确保任务执行时能拿到最新版本:
task createZip(type: Zip) { archiveFileName = provider { "my-app-${project.version}.zip" } from project.sourceSets.main.output }
这种方式会在任务实际执行阶段才计算文件名,避免配置阶段版本未初始化的问题。
4. 验证版本是否正确加载
如果还是有问题,先加个简单任务确认子项目的版本是否正常:
task checkVersion { doLast { println "当前子项目版本:${project.version}" } }
运行./gradlew :你的子项目名:checkVersion,如果能输出正确版本,那回到Zip任务用project.version就没问题。
内容的提问来源于stack exchange,提问作者Anders Martini
相关产品推荐
相关产品推荐

