Gradle Kotlin中copy.from API在构建文件与插件的上下文差异问询
Gradle构建文件与插件中
from函数上下文差异的原因及解决方法 将代码从Gradle构建文件(build.gradle.kts)迁移至Gradle插件(Plugin.kt)时,会遇到一个明显差异:调用同一个from函数时,构建文件里需要用this访问into函数,而插件代码里却要改用it。这本质是Gradle Kotlin DSL在脚本文件与普通Kotlin类文件中的语法糖支持差异导致的。
代码示例对比
build.gradle.kts(构建脚本文件)
tasks.getByName<ProcessResources>("processResources") { this.from(hostedStaticFiles) { this@from.into("static") // 此处使用this访问into函数 } }
Plugin.kt(插件类文件,未添加配置前)
project.tasks.getByName("processResources").let<Task, ProcessResources> { if (it !is ProcessResources) { throw IllegalStateException("The processResources task in Project is not of type ${ProcessResources::class.java}") } it }.apply { dependsOn(hostedStaticFiles) this@apply.from(hostedStaticFiles) { it -> // 此处需要用it访问into函数 it.into("static") } }
依赖配置
dependencies { hostedStaticFiles(project("client")) }
差异原因
Gradle为.kts构建脚本提供了特殊语法糖:处理Gradle的Action接口时,默认使用带接收者的lambda——lambda内部的this直接指向Action的接收者对象(也就是from函数的配置上下文)。
而普通.kt类文件(比如插件代码),若未启用Gradle Kotlin DSL相关支持,Kotlin会把Action接口的实现当作普通lambda处理,此时需要显式通过参数(比如it)访问接收者对象。
解决方法
在buildSrc/build.gradle.kts中添加如下插件配置,让插件代码也能享受Gradle Kotlin DSL的语法糖支持:
plugins { `java-gradle-plugin` `kotlin-dsl` }
添加后,插件代码就可以和构建脚本一样,用this访问into函数的上下文了。
内容的提问来源于stack exchange,提问作者Krause
相关产品推荐
相关产品推荐

