Концепция, которая вас заинтересует, известна как Batching .
Я описал этот точный сценарий в своем блоге на http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx
Вот текст этой записи в блоге, вы можете скачать упомянутые файлы по ссылке выше.
Сегодня кто-то рассказывал мне о сотруднике, у которого были проблемы с MSBuild. Он сказал мне, что пытается скопировать набор файлов на набор разных серверов. Но проблема заключалась в том, что он не знал, как этого добиться, не выполняя несколько вызовов задачи «Копировать». Я сказал ему, что он может добиться этого с помощью MSBuild Batching. Пакетирование - это процесс выполнения задачи (или цели) для набора элементов (пакетов) за один раз. Партия также может включать один элемент. Таким образом, в этом сценарии нам нужно выполнить копирование один раз для каждого сервера, на котором он хотел развернуть. Я создал простой файл msbuild, который демонстрирует это двумя разными способами. Первый способ использует пакетное задание, которое можно увидеть в цели теста. А другой использует группировку Target, что можно увидеть в цели DoItCore. Я также создал чистую цель, которая не имеет ничего общего с группированием.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test">
<ItemGroup>
<SourceFiles Include="*.txt"/>
<Dest Include="One;Two;Three;Four;Five"/>
</ItemGroup>
<Target Name="Test">
<Copy SourceFiles ="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
<Message Text="Fullpath: %(Dest.FullPath)"/>
</Target>
<!-- These targets demonstrate target batching -->
<Target Name="DoIt" DependsOnTargets="DoItCore"/>
<Target Name="DoItCore" Inputs="@(SourceFiles)" Outputs="%(Dest.FullPath)">
<Copy SourceFiles="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
</Target>
<!-- This will clean up the files -->
<Target Name="Clean">
<CreateItem Include="%(Dest.FullPath)\**\*">
<Output ItemName="FilesToDelete" TaskParameter="Include"/>
</CreateItem>
<Delete Files="@(FilesToDelete)"/>
</Target>
</Project>
Пакетная обработка - это сложная тема MSBuild, которой определенно пренебрегают. Я должен признать, что я виноват в том, что сам не написал об этом достаточно. Есть несколько хороших ресурсов для пакетирования, они перечислены ниже.
Вот некоторые другие записи блога, которые я опубликовал.
Спасибо,
Сказал Ибрагим Хашими
Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build