kotlin - 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/ 一起工作?!
对此的任何帮助将不胜感激!提前谢谢:)
解决方案
解决了使用函数而不是对象的问题,例如:
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
}
其余代码保持不变。
干杯,弗洛里安
推荐阅读
- html - “时钟”字体真棒图标未显示在我的网页上
- clojure - 为什么 clojure fn 的结果包含括号?
- amazon-web-services - 有没有办法为 S3 lambda 过滤器包含 aws cognito 身份 ID?
- html - Wordpress - 移动设备上的第一列低于另一列
- react-native - 清除浏览器 cookie React Native 0.60
- javascript - PDFJS:无效的 PDF 结构
- flutter - 颤振 | Dio Package ...在后台下载大文件
- spring - Spring boot 项目 .war 文件在 web-apps 文件夹中部署后不会自动启动
- excel - 运行时错误“1004”无法获取数据透视表类的 PivotFields 属性
- python - For Loop 在每次迭代中创建新的数据帧