Gradle任务内调用带参数的其他任务失败,求助解决方案
Gradle任务调用与参数传递问题解决
你遇到的核心问题是没摸透Gradle的任务执行逻辑——Gradle把构建过程分成配置阶段和执行阶段,你原来在任务A的执行代码里直接调用任务B并传参数的方式,完全不符合它的运行模型。而且-P是启动构建时的命令行参数,早就被解析完了,执行阶段再传根本没用。
两种可行的实现方案
方案1:主动触发任务执行
直接在任务A里收集输入、设置项目属性,然后触发任务B的执行:
task A { doFirst { // 弹出输入框获取版本号 ant.input(message: "Version:", addproperty: 'version') def inputVer = ant.properties.version // 把版本号存入项目属性 project.ext.version = inputVer // 触发任务B执行 gradle.taskGraph.execute(tasks.B) } } task B { doFirst { println "Version: ${project.ext.version}" } }
方案2:用任务依赖自动触发
如果想让A执行完自动运行B,用finalizedBy关联任务,同时延迟属性读取避免配置阶段报错:
task A { doFirst { ant.input(message: "Version:", addproperty: 'version') project.ext.version = ant.properties.version } } task B { // 延迟到执行阶段读取属性,避免配置阶段找不到值 doFirst { println "Version: ${project.ext.version}" } } // 绑定A和B的执行关系 A.finalizedBy(B)
为啥原来的写法不行?
tasks.b "-Pversion=${ant.properties.version}"是错误的调用方式,Gradle的任务引用不支持这种传参语法,不属于合法的任务调用逻辑。-P参数是Gradle启动时就解析的命令行参数,属于构建初始化阶段的配置,执行阶段再传递该参数,任务B根本无法感知到。
验证方法
运行gradle A,输入版本号后,就能看到任务B打印出对应的版本信息了。
内容的提问来源于stack exchange,提问作者Reage
相关产品推荐
相关产品推荐

