【问题标题】:Kotlin delegation gradle taskKotlin 委托 gradle 任务
【发布时间】:2020-05-13 03:23:52
【问题描述】:

我有这样的事情:

fun doSomething(specifyInput: Base.() -> Unit) {
    val spec = BaseImpl()
    spec.apply {
        specifyInput()
        validate()
    }

interface Base {
    var a: String?
    var b: String?
}

class BaseImpl(override var a: String?, override var b: String?) : Base {
    constructor() : this(null, null)
fun validate() {
        if (a == null) throw ExceptionForA()
        if (b == null) throw ExceptionForB()
    }
}

这是 gradle 任务。

class A : DefaultTask(), Base by BaseImpl()

@TaskAction
fun doSomething() {
    doSomething {
       a = c
    }
}

这是我的测试:

val buildFile = File(testProjectDir, "build.gradle.kts")
        buildFile.createNewFile()
        buildFile.writeText("""
                tasks.register("task", A::class.java) {
                    c = "something"
                }
            """.trimIndent())
        val result = testProjectDir.executeAndFailGradleRunner("task")

        assertThat(result.output).contains("ExceptionForB")

你知道我需要做什么才能通过测试吗?

提前谢谢你。

更新:同时我已经扩展了代码示例。

找到了我正在寻找的解决方案。

【问题讨论】:

  • 在 lambda 中你会得到一个 this 接收器,你可以只做 download { url = /*your url*/; target = /*your file*/ } (在单独的行中;不是必需的)
  • 什么意思?这里的任务是什么?编辑您的问题并总结问题。
  • 我编辑了我的问题并总结了问题。
  • 你必须设置这两个变量,就好像其中一个变量为 null 然后引发异常。
  • 我不明白应该在哪里设置这两个变量。可以举个例子吗?

标签: kotlin gradle-kotlin-dsl


【解决方案1】:

我找到了解决方案。 我必须使用另一个变量并从委托中分配我的变量 a = c,不能使用 a = a。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2021-02-20
    相关资源
    最近更新 更多