【问题标题】:How do you extend a task for Gradle when using Kotlin to implement a plugin?使用 Kotlin 实现插件时如何为 Gradle 扩展任务?
【发布时间】:2019-01-17 04:32:53
【问题描述】:

我觉得这个答案很简单,但是我找不到。

我正在尝试使用 Kotlin 创建 Gradle 扩展。我要做的第一个任务是有效地调用project.copy 任务,这样我就可以将源文件移动到构建目录并执行令牌替换(我知道,我还没有实现)。

这会编译,并且插件被 Gradle 识别。有(至少)2个问题。编译器抱怨 frominto 或未使用。我的第一个线索是我做错了什么。第二个是当我运行任务时 Gradle 告诉我这个错误:

* What went wrong:
Execution failed for task ':gsqlCopySources'.
> Cannot convert path to File. path='null'

代码:

import org.gradle.api.DefaultTask
import com.optum.giraffle.GsqlExtension
import org.gradle.api.tasks.*
import java.io.File

open class CopySources: DefaultTask() {

    private val extension = project.extensions.run {
        findByName("gsql") as GsqlExtension
    }
    @OutputDirectory
    val outputDirectory: File = project.file("${project.buildDir}/${extension.scriptPath}")

    @InputDirectory
    val inputDirectory: File = project.file("${project.rootDir}/${extension.scriptPath}")

    init {
        group = "build"
        description = "Copy gsql scripts to build directory performing token replacement"

    }

    @TaskAction
    fun copyFiles() {
        inputDirectory.apply {
            parentFile.mkdirs()
        }
        project.copy{
            val from = inputDirectory
            val into = outputDirectory
        }
    }
}

【问题讨论】:

    标签: gradle kotlin


    【解决方案1】:

    我想我找到了解决方案,看起来 frominto 是函数。

    @TaskAction
    fun copyFiles() {
        inputDirectory.apply {
            parentFile.mkdirs()
        }
        project.copy{ copySpec ->
            copySpec.from(inputDirectory)
            copySpec.into(outputDirectory)
        }
    }
    

    【讨论】:

    • 没错。从 gradle 翻译到 kotlin 可能会导致这种混乱。实际上,在副本中,您可以将copySpec 访问为this,因此您实际上不需要指定参数
    • @EricMartori,是的,我尝试过使用this,它确实有效。我使用的 IDE 建议使用显式命名的参数,所以我这样做了。
    【解决方案2】:

    您正在为 frominto 声明新值,而不是分配现有值。

    你的代码应该是:

        @TaskAction
    fun copyFiles() {
        inputDirectory.apply {
            parentFile.mkdirs()
        }
        project.copy{
            from(inputDirectory)
            into(outputDirectory)
        }
    }
    

    【讨论】:

    • 这仍然不起作用。我得到未解决的引用。
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多