0

我有以下 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 进行验证时,第一个规则按预期失败,但第二个规则通过了。我尝试了几个选项,但我不知道我做错了什么。

4

1 回答 1

1

有几件事看起来有点奇怪:

  • 对项目组的迭代需要进入规则内部。
  • 用于!= 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 确实添加另一个规则来拒绝也没有多大意义不包含该值。

于 2021-10-25T14:50:29.317 回答