如何在 Gradle Kotlin 构建中配置 processResources 任务

How to configure the processResources task in a Gradle Kotlin build

我在基于 groovy 的构建脚本中有以下内容。我如何在基于 kotlin 的脚本中执行相同的操作?

processResources {

    filesMatching('application.properties'){
        expand(project.properties)
    }

}

我认为任务应该是这样的:

编辑:根据此 comment in gradle/kotlin-dsl 存储库。任务配置应该这样工作:

import org.gradle.language.jvm.tasks.ProcessResources

apply {
    plugin("java")
}

(tasks.getByName("processResources") as ProcessResources).apply {
    filesMatching("application.properties") {
        expand(project.properties)
    }
}

这很丑。所以我建议为此目的遵循效用函数,直到一个上游完成:

configure<ProcessResources>("processResources") {
    filesMatching("application.properties") {
        expand(project.properties)
    }
}

inline fun <reified C> Project.configure(name: String, configuration: C.() -> Unit) {
    (this.tasks.getByName(name) as C).configuration()
}

随着更新版本的 Kotlin DSL 和 Gradle 中 API 的更新,您可以执行以下操作:

import org.gradle.language.jvm.tasks.ProcessResources

plugins {
  java
}

tasks {
  "processResources"(ProcessResources::class) {
    filesMatching("application.properties") {
      expand(project.properties)
    }
  }
}

还有:

val processResources by tasks.getting(ProcessResources::class) {
  filesMatching("application.properties") {
    expand(project.properties)
  }
}

为什么不直接使用 "withType" 呢? 我只是说(恕我直言)

tasks {
  withType<ProcessResources> {
.. 
}

看起来比

好多了
tasks {
  "processResources"(ProcessResources::class) {
.. 
}

所以,

tasks.withType<ProcessResources> {
    //from("${project.projectDir}src/main/resources")
    //into("${project.buildDir}/whatever/")
    filesMatching("*.cfg") {
        expand(project.properties)
    }
}

编辑:

对于较新的版本,您只需执行以下操作:

tasks.processResources {}

tasks { processResources {} }

生成的访问器是 "lazy",因此它具有所有优点而没有缺点。