У меня есть проект C#, где мне нужно включить файл в качестве ресурса. Я не знаю полного имени файла заранее, так как он будет содержать номер версии, с которым я не могу легко получить доступ во время сборки. Поэтому я использую уайлдкард так:Assert количество элементов в Include with wildcard
<ItemGroup>
<EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe">
<Link>Setup\%(filename)%(extension)</Link>
<LogicalName>Setup\%(filename)%(extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
Он работает, но проблема в том, что она может включать в себя любое количество файлов, и я хочу, чтобы включать в себя ровно один. В папке должен быть только один файл соответствия. Если есть нулевые или несколько файлов, которые соответствуют шаблону, я хочу, чтобы это была ошибка сборки. Есть ли способ утверждать, что включен только один файл?
EDIT: Благодаря ответ @ Стейн, я был в состоянии сделать это следующим образом:
<Target Name="BeforeBuild">
<ItemGroup>
<EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe">
<Link>AppFiles\%(filename)%(extension)</Link>
<LogicalName>AppFiles\%(filename)%(extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
<PropertyGroup>
<SetupFileCount>@(EmbeddedResource->Count())</SetupFileCount>
</PropertyGroup>
<Error Text="Expected exactly one file matching 'MyApp-setup-*'; found $(SetupFileCount)." Condition="'$(SetupFileCount)' != '1'"/>
</Target>
Вы пробовали? дикая карта MyApp-setup-? – Zinov
@ Zinov '?' Просто соответствует одному символу. Я мог бы сделать MyApp-setup -?.?.?.? ', Но он все равно может соответствовать нескольким файлам. –
Я здесь смущен, вы сказали, что заранее не знаете полного имени файла (значит, вы можете разрешить его только во время выполнения нет?), А затем вы хотите, чтобы это была ошибка сборки. Можете ли вы лучше объяснить свой подход? Является ли MyApp-setup- # где # номер версии ?, но все равно там вы получите более одного соответствия. – Zinov