2016-12-20 2 views
2

У меня есть проект 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> 
+0

Вы пробовали? дикая карта MyApp-setup-? – Zinov

+0

@ Zinov '?' Просто соответствует одному символу. Я мог бы сделать MyApp-setup -?.?.?.? ', Но он все равно может соответствовать нескольким файлам. –

+0

Я здесь смущен, вы сказали, что заранее не знаете полного имени файла (значит, вы можете разрешить его только во время выполнения нет?), А затем вы хотите, чтобы это была ошибка сборки. Можете ли вы лучше объяснить свой подход? Является ли MyApp-setup- # где # номер версии ?, но все равно там вы получите более одного соответствия. – Zinov

ответ

1

Используйте Item Function «Count», чтобы получить количество элементов и вызовет ошибку, если это не 1:

<Target Name="ErrorIfNotOneEmbeddedResourceFound" BeforeTargets="Build"> 
    <ItemGroup> 
    <EmbeddedResource Include="..\..\setup\bin\MyApp-setup-*.exe"> 
     <Link>Setup\%(filename)%(extension)</Link> 
     <LogicalName>Setup\%(filename)%(extension)</LogicalName> 
    </EmbeddedResource> 
    </ItemGroup> 
    <Error Text="Didn't find one match" Condition="'@(EmbeddedResource->Count())' != '1'"/> 
</Target> 
+0

Кажется, именно то, что я ищу. Я дам ему попробовать завтра, спасибо! –

+0

В качестве альтернативы вы можете найти все совпадения, затем проанализировать номер версии, чтобы найти наивысшую версию, или считая созданную дату или так, предполагая, что это то, что вам нужно. Но это сложнее, и если это произойдет нечасто, просто повышение ошибки лучше imo. – stijn

+0

Не знаете, почему, но я не мог заставить эту цель работать до 'Build'; он фактически запускался * после * 'CoreBuild', поэтому ресурс не был включен. В конечном итоге я поставил задачи в целевой объект BeforeBuild. Теперь он отлично работает, спасибо! –