Gradle技术疑问:为何仅最外层第二个commandLine被执行?
Gradle Exec任务commandLine执行逻辑解析
任务代码
task<Exec>("myTask-1"){ commandLine("echo", "outside commandLine echo-1") commandLine("echo", "outside commandLine echo-2") println("outside-printl1") println("outside-printl2") doLast { commandLine("echo", "doLast commandLine echo-1") commandLine("echo", "doLast commandLine echo-2") println("doLast printl-1") println("doLast printl-2") } }
执行命令与结果
执行命令:gradle -q myTask-1
输出:
outside-printl1 outside-printl2 outside commandLine echo-2 doLast printl-1 doLast printl-2
问题解答
1. 最外层仅第二个commandLine生效的原因
在任务配置块(最外层代码)中,commandLine()是对Exec任务的属性赋值操作,而非追加命令。每次调用commandLine()都会直接覆盖之前的属性值,所以最后一次赋值的commandLine("echo", "outside commandLine echo-2")会成为任务最终执行的命令,第一次赋值的命令被完全替换,自然不会执行。
2. doLast块中commandLine无效的原因
doLast属于任务的执行阶段代码块,但Exec任务的执行逻辑是在配置阶段就确定好的。执行阶段调用commandLine()虽然会修改任务属性,但此时Exec任务的执行流程已经启动,不会再读取更新后的属性来执行新命令,因此doLast里的commandLine配置不会生效。
3. println的执行时机差异
配置块中的println在Gradle的配置阶段就会执行,所以会最先输出;doLast里的println在任务的执行阶段运行,因此会在命令执行完成后打印。
内容的提问来源于stack exchange,提问作者user7858768
相关产品推荐
相关产品推荐

