Gradle 4直接升级至6后动态任务执行失败求助
解决Gradle 6中动态Copy任务执行的问题
这个问题的核心是没跟上Gradle从4到6的核心机制变化——Gradle 5+移除了Task.execute()方法,而且任务必须通过Gradle的任务图来执行,不能手动调用执行。另外你用finalizedBy的方案失败,是因为你在执行阶段(doLast里面)才动态创建任务并关联依赖,这时候Gradle的任务图已经构建完成了,根本不会处理新添加的依赖关系。
下面给你两个可行的解决方案,根据你的实际需求选择:
方案一:直接用project.copy()方法(最简单)
如果你的需求只是执行复制操作,不需要把这个复制逻辑作为独立的Gradle任务(比如不需要单独执行这个复制、不需要它参与任务依赖图),那直接用Gradle提供的project.copy()方法就可以了,这个方法可以安全地在执行阶段调用:
def myCopy(src, dest, rules) { // 在这里处理你的业务逻辑rules println "处理业务规则: ${rules}" // 直接调用project.copy执行复制 project.copy { from src into dest // 如果rules需要过滤文件,可以在这里添加include/exclude等配置 // 比如 rules.each { rule -> include rule } } } task doCopy { doLast { myCopy('resources', 'newResources', []) } }
这个方案完全贴合你原来的代码结构,不需要改变太多,直接替换掉原来的Copy任务创建和execute()调用即可。
方案二:在配置阶段创建任务并建立依赖(适合需要任务参与依赖图的场景)
如果你需要这个复制操作作为一个独立的Gradle任务(比如可以单独执行、需要和其他任务建立依赖),那必须在配置阶段创建任务并设置依赖,而不是在执行阶段的doLast里:
def myCopy(src, dest, rules) { // 处理你的业务逻辑rules println "处理业务规则: ${rules}" // 在配置阶段创建Copy任务 Copy cc = task("cc${dest}", type: Copy) { from src into dest // 这里添加rules对应的配置,比如文件过滤 } return cc } task doCopy { // 在配置阶段就建立依赖关系,让Gradle把ccnewResources任务加入任务图 dependsOn myCopy('resources', 'newResources', []) }
这样执行./gradlew doCopy的时候,Gradle会在配置阶段就创建ccnewResources任务,并且因为doCopy依赖它,所以会自动先执行这个复制任务,再执行doCopy的doLast逻辑(如果有的话)。
为什么你的finalizedBy方案不行?
再解释下你之前的尝试失败的原因:
- Gradle的构建过程分为配置阶段和执行阶段:配置阶段用来构建任务图,确定哪些任务要执行、执行顺序;执行阶段才会运行任务的
doLast等动作。 - 你的
myCopy是在doCopy的doLast里调用的,这已经是执行阶段了,这时候任务图已经固定,你动态创建的任务和添加的finalizedBy关联根本不会被Gradle处理,所以noop执行完后不会触发复制任务。
内容的提问来源于stack exchange,提问作者singhspk
相关产品推荐
相关产品推荐

