在下面的MSBuild片段中,我试图制作一个ItemGroup,其中包含所引用程序集的子集-因此,如果引用了LibA或LibB,则它们将包含在输出项中,但是如果它们重新引用,则不包含这些内容(并且除了指定的内容外,它将永远不会包含其他任何内容)。
<ItemGroup>
<RefSubset Include="@(ReferencePath)"
Condition="'%(ReferencePath.Filename)' == 'LibA' OR
'%(ReferencePath.Filename)' == 'LibB'"/>
</ItemGroup>
这行得通,但看起来并不优雅。我想做的是这样的:
<PropertyGroup>
<RefSubsetNames>LibA;LibB</RefSubsetNames>
</PropertyGroup>
然后以使用RefSubset
执行条件的方式重写RefSubsetNames
规则。
重要目标:
ReferencePath
上的所有元数据必须保留在RefSubset
中。RefSubsetNames
可以包含必须忽略的空值(;;
)。RefSubsetNames
的每个组件都应在ReferencePath.Filename
上进行精确匹配-不应允许子集匹配(因此基本的Contains
检查是错误的)。我已经设法达到了我想要的目标,但是看起来有点难看,我想知道是否有更好的解决方案?
<ItemGroup>
<RefSubset Include="@(ReferencePath)"
Condition="$([System.String]::Copy(';$(RefSubsetNames);').Contains(';%(ReferencePath.Filename);'))" />
</ItemGroup>