2009-05-29 8 views

Respuesta

8

Aquí se muestra un ejemplo real que junté que muestra lo que estabas buscando:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test" ToolsVersion="3.5"> 

    <!--Declare an ItemGroup that points to your file you want to copy.--> 
    <ItemGroup> 
    <ItemToCopy Include=".\Home.aspx" /> 
    </ItemGroup> 

    <!--Declare an ItemGroup that points to your destination Locations--> 
    <ItemGroup> 
    <DestLocations Include=".\abc\home.aspx" /> 
    <DestLocations Include=".\def\home.aspx" /> 
    <DestLocations Include=".\ghi\home.aspx" /> 
    </ItemGroup> 

    <Target Name="CopyFiles"> 
    <!--Run the copy command to copy the item to your dest locations--> 
    <!--This is where the magic happens. The % sign before the DestLocations reference says to use 
    Batching. So Copy will be run for each unique FullPath MetaData in the DestLocations ItemGroup.--> 
    <Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DestLocations.FullPath)" /> 
    </Target> 
</Project> 
+0

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. –

+1

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

0

Realmente es mejor que lo haga usted mismo como ejercicio de aprendizaje, en lugar de tratar a MSBUILD como una caja mágica. This article from Patrick Smacchia le brinda la mayoría de las técnicas involucradas.

+0

De hecho, estoy tratando de familiarizarme con MSBuild al tratar de automatizar varias tareas que he estado haciendo hasta el día de hoy de forma manual. He leído varios tutoriales similares al que mencionas (parece que es una copia en abundancia). Al hacerlo, estoy tratando de familiarizarme con la sintaxis y las posibilidades incorporadas. ¿Podrían explicar cómo lo estoy tratando como una caja mágica y cómo su artículo referido puede iluminarme? –

+0

Oye, Boris, no quise decir que "lo tratas como una caja negra" porque eres flojo. Estaba pensando principalmente en mi tiempo de aprendizaje de msbuild: solía tratar de entender una tarea a la vez, pero no la imagen general. Realmente encontré que el artículo de Smacchia era algo que deseaba tener una semana antes de que lo obtuviera. Como autor de NDepend, no es un comerciante de corte y pegado. En términos de definición de la lista, imagino que una propiedad [lista xml] funcionaría para la lista, y luego usaría la tarea Copiar con la facilidad de bucle/comodín de lista para recorrer la lista. No lo he hecho yo mismo; de lo contrario, pegaría la muestra. –

+0

Gracias por su respuesta. Voy a echar un segundo vistazo completo al artículo. –

2

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

+0

Si entiendo la convención para separarlos con ';' hace que el parámetro sea una lista en lugar de un solo elemento. Voy a verificar esto después de las horas de trabajo. Gracias –

Cuestiones relacionadas