如何在TeamCity Kotlin DSL中基于现有的构建步骤创建自定义构建步骤?

7

我使用TeamCity Kotlin DSL 2018.1来设置构建配置。我的settings.kts文件如下:

version = "2018.1"

project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            ant {
                name = "Step1"
                targets = "target1"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ant {
                name = "Step2"
                targets = "target2"
                mode = antFile { path = "/some/path" }
                workingDir = "/some/dir"
                jdkHome = "some_jdk"
            }
            ...
        }
    }
}

它按预期工作,但我希望避免反复编写相同的重复参数。

我尝试编写函数,它将构建步骤填充默认值:

fun customAnt(init: AntBuildStep.() -> kotlin.Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val ant = AntBuildStep()
    ant.mode = ant_file
    ant.workingDir = "/some/dir"
    ant.jdkHome = "some_jdk"
    return ant
}
project {
    buildType {
        id("some-id")
        name = "name"
        steps {
            customAnt {
                name = "Step1"
                targets = "target1"
            }
            customAnt {
                name = "Step2"
                targets = "target2"
            }
            ...
        }
    }
}

代码编译成功,但无法正常工作:TeamCity忽略了以这种方式定义的构建步骤。

不幸的是,官方文档中没有关于自定义和扩展DSL的任何信息。可能我在使用Kotlin的() -> Unit结构时出了问题,但无法确定具体出了什么问题。

1个回答

11

我明白了。

实际上,我离答案很近。以下代码正好能够按照我想要的方式工作:

version = "2018.1"

fun BuildSteps.customAnt(init: AntBuildStep.() -> Unit): AntBuildStep {
    val ant_file = AntBuildStep.Mode.AntFile()
    ant_file.path = "/some/path"

    val result = AntBuildStep(init)
    result.mode = ant_file
    result.workingDir = "/some/dir"
    result.jdkHome = "some_jdk"
    step(result)
    return result
}

project {    
    buildType {
        steps {
            customAnt {
                name = "step1"
                targets = "target1"
            }
            customAnt {
                name = "step2"
                targets = "target2"
            }
            ...
        }
    }
}

你在哪里找到这个的?只是试验吗,还是有地方可以看到这样的东西?我问这个问题是因为我也遇到了同样的问题。 - Caperneoignis
1
TeamCity Kotlin DSL基于Kotlin的类型安全构建器机制。您可以阅读有关此机制的文档:https://kotlinlang.org/docs/type-safe-builders.html 如果您在谷歌上搜索,我相信您也可以找到一些示例。 - Marat Safin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接