Набор-содержит или пересечение в msbuild?

#c# #msbuild

#c# #msbuild

Вопрос:

В следующем фрагменте 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>
  

Комментарии:

1. Вы когда-нибудь это понимали?

2. Код в конце моего вопроса действительно работает, он просто немного уродливее, чем мне бы хотелось.