自定义Gradle插件中doLast()调用异常及文件删除失效问题
Gradle自定义插件中Delete任务执行逻辑问题解决
问题原因分析
Unresolved reference: delete
doLast闭包的默认参数it是通用Task类型,而delete()是Delete任务特有的方法,因此it无法识别该方法,导致语法错误。task.delete()无效果
你创建的是Delete任务,但未配置其默认删除路径,反而在doLast中调用delete()。这种方式不仅冗余,还可能因Gradle任务执行机制导致删除逻辑未正确触发——Delete任务本身就是为执行阶段删除文件设计的,无需额外嵌套doLast。
正确实现方案
方案1:直接配置Delete任务(推荐)
Delete任务的核心逻辑就是配置阶段定义路径,执行阶段自动删除,完全满足“不在配置阶段执行删除”的需求,无需额外doLast:
project.tasks.create("cleanMendix", Delete::class.java) { task -> // 配置要删除的路径(仅在配置阶段执行定义,删除动作在执行阶段触发) task.delete( "${project.projectDir}/target", "${project.projectDir}/.mendix-cache", "${project.projectDir}/userlib", "${project.projectDir}/deployment" ) }.apply { group = "mendix" }
方案2:在doLast中执行删除(适用于需前置逻辑场景)
如果需要先执行其他动作再删除,可直接调用project的delete方法,或明确Delete任务类型:
方式A:调用project.delete
project.tasks.create("cleanMendix") { task -> task.group = "mendix" task.doLast { // 使用Gradle规范的路径获取方式,兼容多系统 project.delete( project.layout.projectDirectory.dir("target"), project.layout.projectDirectory.dir(".mendix-cache"), project.layout.projectDirectory.dir("userlib"), project.layout.projectDirectory.dir("deployment") ) } }
方式B:明确doLast参数类型为Delete
project.tasks.create("cleanMendix", Delete::class.java) { task -> task.group = "mendix" task.doLast { deleteTask: Delete -> deleteTask.delete( project.layout.projectDirectory.dir("target"), project.layout.projectDirectory.dir(".mendix-cache"), project.layout.projectDirectory.dir("userlib"), project.layout.projectDirectory.dir("deployment") ) } }
内容的提问来源于stack exchange,提问作者eszik.k
相关产品推荐
相关产品推荐

