Jsonnet报‘object comprehension can only have one field’错误,求正确代码
Jsonnet中generateSteps函数的错误修复与正确实现
错误原因
原代码触发object comprehension can only have one field错误,是因为Jsonnet的对象推导语法规则限制:带有for循环的对象推导块内部,只能定义一个字段生成规则,而你在循环前直接写了两个字段,违反了这个规则。
正确实现代码
将固定字段与循环生成的字段拆分,通过对象合并的方式组合所有内容:
local generateSteps(branchName) = // 固定步骤:无需循环生成的内容 { [branchName + "_test_456"]: test_456(), [branchName + "_notify_slack_on_failures"]: notify_slack_on_failures() } + // 循环生成对应环境和区域的测试步骤 { // 为每个env+region生成唯一命名的test_123步骤 [branchName + "_test_123_%s_%s" % [envName, region]]: test_123( region, allConfigs[envName]['meta']['branch'], allConfigs[envName]['meta']['aws_access_key_id'], allConfigs[envName]['meta']['aws_secret_access_key'], allConfigs[envName]['meta']['aws_env'] ), // 为每个env+region生成唯一命名的test_345步骤 [branchName + "_test_345_%s_%s" % [envName, region]]: test_345( region, allConfigs[envName]['meta']['branch'], allConfigs[envName]['meta']['aws_access_key_id'], allConfigs[envName]['meta']['aws_secret_access_key'], allConfigs[envName]['meta']['aws_env'] ) for envName in envs for region in allConfigs[envName]['meta']['active_region'] };
关键说明
- 拆分固定字段与循环字段:把不需要循环的步骤单独放在一个对象中,循环生成的部分单独作为一个推导对象,再用
+运算符合并。 - 唯一字段名:通过
%格式化字符串,给循环生成的字段名加上envName和region后缀,避免不同循环实例的字段名冲突。 - 符合Jsonnet语法:对象推导块内的字段定义遵循“一个推导块对应一组循环生成的字段”规则,不会触发语法错误。
内容的提问来源于stack exchange,提问作者gthy
相关产品推荐
相关产品推荐

