You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:00:53