#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. Код в конце моего вопроса действительно работает, он просто немного уродливее, чем мне бы хотелось.