首页 > 解决方案 > Kotlin 在为自定义构建步骤生成代码时编译异常(Teamcity)

问题描述

我正在尝试创建自己的构建步骤,它应该包含我一直想要设置的某些参数。我遵循了如何根据 TeamCity Kotlin DSL 中的现有步骤创建自定义构建步骤?并想出了这个:

object testConfig : BuildType({
    name = "test"
    steps {
        postBadgeStatus {
            name = "step1"
            scriptContent = "%teamcity.build.checkoutDir%/SetAutoSDK.bat"
            param("specific1", "test")
            param("specfic2", "%test%")
        }
    }
})

fun BuildSteps.postBadgeStatus(init: ScriptBuildStep.() -> kotlin.Unit): ScriptBuildStep {
    var result = ScriptBuildStep(init)
    result.param("generic1", "%foobar%")
    result.param("generic2", "%foobar%")
    result.param("generic3", "%foobar%")
    step(result)
    return result
}

但这会导致以下错误/异常(241,11 是打开括号的步骤):

[ERROR] Compilation error settings.kts[241:11]: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtLambdaExpression
File being compiled: (241,11) in C:/Users/flori/AppData/Local/Temp/configs3538219171346858828dsl/settings.kts
The root cause java.lang.UnsupportedOperationException was thrown at: org.jetbrains.kotlin.codegen.context.CodegenContext.getOuterExpression(CodegenContext.java:222)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:336)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:294)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:410)
    at org.jetbrains.kotlin.codegen.CallGenerator$DefaultCallGenerator.genValueAndPut(CallGenerator.kt:70)
    at org.jetbrains.kotlin.codegen.CallBasedArgumentGenerator.generateExpression(CallBasedArgumentGenerator.kt:42)
    at org.jetbrains.kotlin.codegen.ArgumentGenerator.generate(ArgumentGenerator.kt:70)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.invokeMethodWithArguments(ExpressionCodegen.java:2709)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.invokeMethodWithArguments(ExpressionCodegen.java:2680)
    at org.jetbrains.kotlin.codegen.Callable$invokeMethodWithArguments$1.invoke(Callable.kt:42)
    at org.jetbrains.kotlin.codegen.Callable$invokeMethodWithArguments$1.invoke(Callable.kt:14)
    at org.jetbrains.kotlin.codegen.OperationStackValue.putSelector(StackValue.kt:79)
    at org.jetbrains.kotlin.codegen.StackValueWithLeaveTask.putSelector(StackValue.kt:67)
    at org.jetbrains.kotlin.codegen.StackValue.put(StackValue.java:125)
    at org.jetbrains.kotlin.codegen.StackValue.put(StackValue.java:118)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.putStackValue(ExpressionCodegen.java:438)
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:419)

我找不到关于那个 tbh 的太多有价值的信息。总的来说,我想我在带有接收器的 Lambdas 上走在正确的轨道上,这里也有一些描述:https ://blog.jetbrains.com/teamcity/2019/03/configuration-as-code-part-2-与 kotlin-scripts/ 一起工作?!

对此的任何帮助将不胜感激!提前谢谢:)

标签: kotlinteamcity

解决方案


解决了使用函数而不是对象的问题,例如:

fun testConfig : BuildType{
    val buildType = BuildType()
    buildType.name = "test"
    buildType.steps {
        postBadgeStatus {
            name = "step1"
            scriptContent = "%teamcity.build.checkoutDir%/SetAutoSDK.bat"
            param("specific1", "test")
            param("specfic2", "%test%")
        }
    }
    return buildType
 }

其余代码保持不变。

干杯,弗洛里安


推荐阅读