Gradle命令行参数无法传递给子任务,调用任务无法使用命令行属性
问题原因与解决方案
你遇到的核心问题是**GradleBuild类型的任务默认不会将命令行传入的属性传递给它调用的子任务**——因为GradleBuild本质是启动了一个全新的Gradle子进程,这个子进程不会自动继承主进程的命令行参数,所以子任务createZip无法获取到你在命令行传入的buildNumber和stagingDestPath。
下面提供两种可行的解决方案,你可以根据场景选择:
方案1:显式给GradleBuild传递属性
修改cleanBuildPublish任务的配置,通过startParameter把需要的属性手动传递给子构建进程:
task cleanBuildPublish(type: GradleBuild) { description 'Creates the clean build of oms.zip.' tasks = ['collectAllDependencies', 'createZip'] // 把主项目的属性传递给子构建 startParameter.projectProperties = [ 'buildNumber': project.findProperty('buildNumber') ?: 'default', 'stagingDestPath': project.findProperty('stagingDestPath') ?: 'C:/Sites/Project/releases/' ] }
这个方案适合你确实需要用GradleBuild启动子构建的场景,能精确控制传递哪些属性。
方案2:简化任务结构,放弃GradleBuild
其实你完全不需要用GradleBuild来串联任务,普通的任务依赖就能实现相同效果,而且所有子任务会直接共享主项目的属性,不需要额外配置:
task cleanBuildPublish { description 'Creates the clean build of oms.zip.' dependsOn 'collectAllDependencies', 'createZip' }
这种方式更简洁,也从根源上避免了属性传递的问题,因为所有任务都在同一个Gradle进程中运行,直接访问project的属性。
额外优化建议
你可以把属性提取逻辑放到项目根级别,避免在多个任务中重复编写:
// 项目全局定义,所有任务均可直接使用 ext { buildNumber = project.hasProperty('buildNumber') ? project.property('buildNumber') : 'default' stagingDestPath= project.hasProperty('stagingDestPath') ? project.property('stagingDestPath') : 'C:/Sites/Project/releases/' } task createZip(type: Zip, dependsOn: 'copyContentToZip') { from tempContainerDir + projName baseName projName +'-'+buildVersion+ '-'+ buildNumber destinationDir file(stagingDestPath) } task cleanBuildPublish { description 'Creates the clean build of oms.zip.' dependsOn 'collectAllDependencies', 'createZip' }
内容的提问来源于stack exchange,提问作者Abs
相关产品推荐
相关产品推荐

