如何从 Kotlin DSL 调用 closure

How to call closure from Kotlin DSL

提问人:codeYogico 提问时间:3/2/2023 最后编辑:aSemycodeYogico 更新时间:3/3/2023 访问量:155

问:

我在 Groovy 中有一个 Gradle 插件,它有一个 setter 方法

void setDynamicTokens(Map<String, ?> dynamicTokens) {
    this.dynamicTokens = dynamicTokens
            .collectEntries { k, v ->
                [(k): [refId: { v.refId }, defaultValue: { v.defaultValue }, transform: {
                            v.transform ?: {
                                it
                            }
                        }]]
            }
            .collectEntries { k, v ->
                [(k): v as DynamicToken]
            } as Map<String, DynamicToken>
}

动态令牌是一个接口

interface DynamicToken {
    String refId()

    String defaultValue()

    Closure<?> transform()
}

在我们曾经设置过这样的东西中build.gradle

dynamicTokens = [
        deployName             : [refId: "deploy.name", defaultValue: project.name.toLowerCase().replaceAll("[-]", ""), transform: {
                it.length() > 20 ? it.substring(0, 20) : it
            }],
        jvmAllowedMemory       : [refId: "jvm.allowed.memory", defaultValue: "1024m"],
        jvmActiveProcessors    : [refId: "jvm.active.processors", defaultValue: "2"],
        autoscaleMinReplicasCentral   : [refId: "autoscale.minReplicas.central", defaultValue: "1"],
        deploymentStrategy   : [refId: "deployment.strategy", defaultValue: "canary"],
        resourcesCpuMillicores : [refId: "resources.cpu.millicores", defaultValue: "2000"],
        resourcesCpu           : [refId: "resources.cpu.millicores", defaultValue: "2000", transform: { "${it}m".toString() }],
        resourcesMemoryMi      : [refId: "resources.memory", defaultValue: "2048"],
        resourcesMemory        : [refId: "resources.memory", defaultValue: "2048", transform: { "${it}Mi".toString() }],
    ]

但是我不确定如何从 调用关闭。我正在尝试做类似的事情,但没有用build.gradle.kts

project.extensions.getByType(com.tgt.search.deploy.prepare.plugin.PluginExtension::class.java).apply {
      
        setDynamicTokens(
            mapOf<String,DynamicToken>(
                "deployName" to object:DynamicToken{
                    override fun transform()=KotlinClosure1<String, String>({
                        if (this.length > 20) this.substring(0, 20) else this
                    })

                    override fun defaultValue()=project.name.toLowerCase()
                    override fun refId()="deploy.name"
                }
gradle build.gradle gradle-plugin gradle-kotlin-dsl kotlin-dsl

评论


答: 暂无答案