You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

conftest规则使用contains函数验证dotnet项目XML未生效问题咨询

问题核心原因

你遇到的问题是Rego写法误区和XML解析特性共同导致的:

  • 迭代变量作用域冲突+重复迭代
    你全局定义project_reference = input.Project.ItemGroup[i].ProjectReference时已经使用自由变量i遍历ItemGroup索引,后续deny规则中再次使用i索引project_reference属于重复迭代,且同名变量会导致绑定逻辑混乱。
    另外如果XML中只有1个ProjectReference节点,conftest解析XML时会直接将其转为对象而非数组,此时你用project_reference[i]取值相当于对单个对象用数字索引取属性,结果为undefined,contains函数接收到undefined参数时会返回空,not 空的结果为false,规则条件不成立就不会触发deny,看起来就是规则意外通过。
  • 等号使用不规范
    Rego中=是赋值/统一操作符,相等判断应该用==,你第一条规则的写法刚好被Rego解析为相等判断所以触发了预期结果,但这种写法存在歧义,容易导致隐性问题。

修复后的规则

推荐取消全局变量的写法,直接在每个deny规则内部完成迭代,兼容XML单节点/多节点的解析差异:

package main

deny[msg] {
    itemGroup := input.Project.ItemGroup[_]
    # 用_自动迭代,兼容单节点(解析为对象)和多节点(解析为数组)场景
    projRef := itemGroup.ProjectReference[_]
    not projRef["-Include"] == "XYZ"
    msg := sprintf("in %v works \n", [projRef])
}

deny[msg] {
    itemGroup := input.Project.ItemGroup[_]
    projRef := itemGroup.ProjectReference[_]
    not contains(projRef["-Include"], "XYZ")
    msg := sprintf("in %v doesn't work \n", [projRef])
}

验证方法

如果仍有问题,可以在规则中加入trace()函数打印变量值,执行conftest时加--trace参数就能看到变量的实际取值,快速定位问题:

deny[msg] {
    itemGroup := input.Project.ItemGroup[_]
    projRef := itemGroup.ProjectReference[_]
    # 打印Include属性的值
    trace(projRef["-Include"])
    not contains(projRef["-Include"], "XYZ")
    msg := sprintf("in %v doesn't work \n", [projRef])
}

内容的提问来源于stack exchange,提问作者Piotr Stapp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:36:03