在 conftest 规则中使用包含

Using contains in conftest rules

我有以下 XML(这是一个 dotnet 项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <None Remove="appsettings.json" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="LoadA1Test" />
  </ItemGroup>
</Project>

以及以下规则:

package main

project_reference = input.Project.ItemGroup[i].ProjectReference

deny[msg] {

    not project_reference[i]["-Include"] = "XYZ"
    msg = sprintf("in %s works \n", [project_reference[i]])
}

deny[msg] {
    
    not contains(project_reference[i]["-Include"],"XYZ")
    msg = sprintf("in %s doesn't work \n", [project_reference[i]])
}

当我尝试使用 conftest 进行验证时,第一条规则按预期失败,但第二条规则通过了。我尝试了几个选项,但我不知道我做错了什么。

有些东西看起来有点奇怪:

  • 项目组的迭代需要在规则内进行。
  • 使用 != x 检查字符串是否不等于 x。

而且我认为您不需要重用 i 迭代器,因为您正在项目参考中查找映射键。像这样的事情可能会做:

package main

deny[msg] {
    project_reference := input.Project.ItemGroup[_].ProjectReference
    project_reference["-Include"] != "XYZ"
    msg = sprintf("-Include (%v) != XYZ", [project_reference["-Include"]])
}

deny[msg] {
    project_reference := input.Project.ItemGroup[_].ProjectReference
    not contains(project_reference["-Include"], "XYZ")
    msg = sprintf("-Include: (%v) does not contain XYZ", [project_reference["-Include"]])
}

尽管我不确定其中的逻辑,因为如果 -Include 值不完全是 XYZ,第一条规则总是会失败,所以添加另一个规则来拒绝也没有多大意义同样如果 -Include 不包含该值。