Gradle左移运算符(<<)与doLast的行为差异咨询
问题解析:Gradle中
<<与doLast的行为差异 你遇到的问题核心是闭包的传递与调用方式错误,并不是<<和doLast本身的功能差异——实际上<<确实是doLast的语法糖,但你的第二个任务写法有误,导致闭包没有被正确执行。
先拆解两种写法的本质
使用
<<的正确执行逻辑
你的第一个任务:task CommonTask << commonThingToDo在Gradle中,
<<等价于调用任务的doLast()方法,并且直接把commonThingToDo这个闭包作为参数传入。当任务执行时,Gradle会自动调用这个闭包,并将当前任务实例作为参数传递给它(也就是闭包里的task参数),所以会正常输出Running CommonTask。使用
doLast的错误写法
你的第二个任务:task CommonTask_doLast { doLast { commonThingToDo } }这里的问题在于,你在
doLast里又包了一层新的闭包,而这个新闭包只是引用了commonThingToDo这个闭包对象,并没有调用它!相当于你只是告诉Gradle:“任务执行最后要做的事情是拿到这个闭包,但不要执行它”,自然不会有任何输出。
修正后的正确写法
你有两种方式可以让第二个任务和第一个任务表现一致:
- 方式一:直接将闭包传入
doLast(和<<的逻辑完全一致)task CommonTask_doLast { doLast commonThingToDo } - 方式二:在内部闭包中显式调用
commonThingToDo并传入当前任务
如果你一定要包一层闭包(比如需要额外逻辑),需要手动调用闭包并传递参数:
或者利用Gradle闭包的隐式参数task CommonTask_doLast { doLast { task -> commonThingToDo(task) } }it:task CommonTask_doLast { doLast { commonThingToDo(it) } }
验证结果
修正后执行gradle CommonTask_doLast,就会得到和第一个任务一样的输出:
> Task :CommonTask_doLast Running CommonTask_doLast BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
内容的提问来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

