TeamCity Kotlin DSL动态生成BuildType遇ID必填异常求助
TeamCity Kotlin DSL动态生成BuildType时的ID缺失问题
问题重现
尝试用函数动态生成BuildType对象时,执行mvn generate命令报错提示必填的id属性未指定:
import jetbrains.buildServer.configs.kotlin.v2019_2.* version = "2021.2" fun bar() = object : BuildType({ name = "bar" }) {} project { description = "Example" buildType(bar()) }
执行命令后的错误输出:
$ mvn -o org.jetbrains.teamcity:teamcity-configs-maven-plugin:generate [...] [ERROR] Validation error: BuildType(uuid='', id='null', name='bar'): mandatory 'id' property is not specified
但直接使用object声明的BuildType却能正常编译通过:
import jetbrains.buildServer.configs.kotlin.v2019_2.* version = "2021.2" object Foo : BuildType({ name = "foo" }) project { description = "Example" buildType(Foo) }
执行命令后的成功输出:
$ mvn -o org.jetbrains.teamcity:teamcity-configs-maven-plugin:generate [...] [INFO] BUILD SUCCESS
原因分析
这是TeamCity Kotlin DSL的自动ID生成机制和Kotlin语言特性共同作用的结果:
- 对于用
object声明的BuildType单例,TeamCity DSL会自动将object的名称(比如示例中的Foo)作为BuildType的id属性值,不需要显式指定。 - 而通过
object : BuildType(...) {}创建的匿名对象,没有可被DSL识别的固定名称,无法触发自动ID生成逻辑,因此必须显式指定id属性,否则会触发必填项校验失败。
解决办法
要让动态生成的BuildType通过校验,有两种可行方式:
1. 显式指定BuildType的id
在函数创建BuildType时,直接在初始化块中设置id属性:
import jetbrains.buildServer.configs.kotlin.v2019_2.* version = "2021.2" fun bar() = object : BuildType({ id = "bar" name = "bar" }) {} project { description = "Example" buildType(bar()) }
2. 使用动态生成ID的批量逻辑
如果需要批量生成多个BuildType,可以封装带参数的函数,动态生成唯一ID:
import jetbrains.buildServer.configs.kotlin.v2019_2.* version = "2021.2" fun createBuildType(buildId: String, buildName: String) = object : BuildType({ id = buildId name = buildName }) project { description = "Example" buildType(createBuildType("build_1", "Build 1")) buildType(createBuildType("build_2", "Build 2")) }
内容的提问来源于stack exchange,提问作者Pamplemousse
相关产品推荐
相关产品推荐

