Gradle DSL定义Delete任务报错:缺失setValue方法如何解决?
Gradle Kotlin DSL Delete任务定义错误:原因与修复方案
错误含义解析
这个报错Missing 'setValue(Nothing?, KProperty<*>, Delete)' method on delegate of type 'PolymorphicDomainObjectContainer<Delete>'本质是Kotlin DSL委托语法的误用。
在Gradle Kotlin DSL中,by creating这种委托写法仅适用于特定的可配置容器类型,但直接用在Delete任务定义时,PolymorphicDomainObjectContainer容器无法为var类型的属性提供Kotlin委托要求的setValue方法——简单说就是你用错了任务定义的委托方式,导致Gradle无法正确完成任务属性的绑定。
修复方案
这里有两种符合Gradle Kotlin DSL规范的修复方式,推荐第一种懒加载方案:
方案1:使用registering委托(推荐,遵循懒加载最佳实践)
Gradle推荐用registering来注册任务,它支持懒加载(任务仅在需要时才会被创建),性能更优。修改后的代码如下:
val DerbyDbDataFolder: File = file("DerbyDbData") val DerbyLog: File = file("derby.log") tasks { // 用registering替换creating,同时将var改为val(任务引用无需可变) val cleanDerbyDbData by registering(Delete::class) { // 合并两次delete调用,传入多个目标路径 delete(DerbyDbDataFolder, DerbyLog) } "clean" { dependsOn(cleanDerbyDbData) } }
方案2:直接创建任务实例
如果不需要懒加载,也可以跳过委托语法,直接调用create方法显式创建任务:
val DerbyDbDataFolder: File = file("DerbyDbData") val DerbyLog: File = file("derby.log") tasks { // 直接调用create方法获取任务实例 val cleanDerbyDbData = create("cleanDerbyDbData", Delete::class) { delete(DerbyDbDataFolder, DerbyLog) } "clean" { dependsOn(cleanDerbyDbData) } }
额外说明
之前代码里的var cleanDerbyDbData是冗余的,因为任务创建后不需要重新赋值,用val即可;同时两次delete()调用可以合并成一次,传入多个参数,让代码更简洁。
内容的提问来源于stack exchange,提问作者Rahul Khimasia
相关产品推荐
相关产品推荐

