El concepto que usted debe estar interesado en que se conoce como Batching.
he cubierto este escenario exacto en mi blog en http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx
Aquí está el texto de esa entrada de blog, puede descargar los archivos mencionados en el enlace de arriba.
Hoy alguien me estaba hablando de un compañero de trabajo que tenía problemas con MSBuild. Me dijo que estaba intentando copiar un conjunto de archivos a un conjunto de servidores diferentes. Pero el problema era que no sabía cómo lograr esto sin realizar múltiples invocaciones de tareas de copia. Le dije que podía lograr esto usando MSBuild Batching. El procesamiento por lotes es un proceso de realizar una tarea (o un objetivo) en un conjunto de elementos (lotes) a la vez. Un lote también puede incluir un solo elemento. Por lo tanto, en este escenario, debemos realizar la copia una vez para cada servidor en el que desee implementar. Creé un archivo simple de msbuild que demuestra esto de dos maneras diferentes. La primera forma usa lotes de tareas, que se pueden ver en el objetivo de prueba. Y el otro usa lotes de destino que se pueden ver en el objetivo DoItCore. También creé un objetivo limpio, que no tiene nada que ver con el procesamiento por lotes.
<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>
El procesamiento por lotes es un tema avanzado de MSBuild, y se descuida definitivamente. Debo admitir que soy culpable de no haber escrito lo suficiente sobre mí mismo. Hay algunos buenos recursos de procesamiento por lotes, que se enumeran a continuación.
Aquí hay algunas otras entradas de blog de procesamiento por lotes que he publicado.
Gracias, Sayed Ibrahim Hashimi
Mi libro: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build
Genial. Gracias, los comentarios lo dejan muy claro. Sé que podría parecer un poco superficial si digo que no estoy buscando convertirme en un gurú de MSBuild, sino que simplemente resuelvo mi problema aquí. He notado que mediante el uso de una tecnología caso por caso, existe este punto en una curva de aprendizaje donde se tiene suficiente conocimiento disperso de que un estudio completo desde cero es mucho más fácil y pone todo en su lugar. Encuentro esta a menudo la forma más preferible de aprender algo. –
Si no necesita saberlo todo ahora, entonces eso funciona bien. Repare un error en el ejemplo (lo siento). Debe llamar a cualquier tarea (como copiar) en un destino. Lo puse en un objetivo. Llama a la llamada MSBuild con ese nombre de destino (CopyFiles) y ejecutará el objetivo. – Vaccano