2009-05-29 9 views

risposta

8

Ecco un esempio reale che ho messo insieme che mostra quello che stavi cercando:

<?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

Grande. Grazie, i commenti lo rendono molto chiaro. So che potrei sembrare un po 'superficiale se sto dicendo che non sto cercando di diventare un guru di MSBuild, ma piuttosto di risolvere il mio problema qui. Ho notato che usando una tecnologia caso per caso c'è questo punto in una curva di apprendimento in cui hai abbastanza conoscenze sparse che uno studio completo da zero è molto più semplice e mette tutto al suo posto. Trovo questo spesso il modo più preferibile di imparare qualcosa. –

+1

Se non hai bisogno di sapere tutto ora, allora funziona bene. Ho corretto un errore nell'esempio (mi dispiace per quello). È necessario chiamare qualsiasi attività (come copia) in un obiettivo. L'ho messo in un obiettivo. Chiami MSBuild con quel nome di destinazione (CopyFiles) e eseguirà il target. – Vaccano

0

È davvero meglio fare questo da soli come esercizio di apprendimento, piuttosto che trattare MSBUILD come una scatola magica. This article from Patrick Smacchia ti dà la maggior parte delle tecniche coinvolte.

+0

sto effettivamente cercando di familiarizzare con MSBuild cercando di automatizzare le diverse operazioni che ho fatto manualmente fino a oggi. Ho letto diversi tutorial simili a quello a cui ti riferisci (sembra che sia una copia incolla a bizzeffe). In questo modo sto cercando di familiarizzare con la sintassi e le possibilità incorporate. Potresti per favore approfondire come lo sto trattando come una scatola magica e come il tuo articolo di riferimento può illuminarmi? –

+0

Ehi Boris, non intendevo il fatto di "trattarlo come una scatola nera" come se fossi pigro. Stavo principalmente pensando al mio tempo di apprendimento di msbuild: cercavo di capire un compito alla volta, ma non il quadro generale. Ho trovato sinceramente che l'articolo di Smacchia era qualcosa che avrei voluto avere una settimana prima di ottenerlo. Come autore di NDepend non è un venditore di taglia e incolla. In termini di definizione dell'elenco, immagino che una proprietà [lista xml] possa funzionare per l'elenco, e quindi dovresti utilizzare l'attività Copia con la funzione elenco loop/wildcard per visualizzare l'elenco. Non l'ho fatto da solo, altrimenti incollerei il campione. –

+0

Grazie per la risposta. Avrò una seconda occhiata approfondita all'articolo. –

2

Il concetto che si dovrebbe essere interessato a è conosciuta come Batching.

ho coperto questo scenario esatto sul mio blog a http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx

Ecco il testo di questo post di blog, è possibile scaricare i file menzionati al link sopra.


Oggi qualcuno mi ha parlato di un collega che stava avendo problemi con MSBuild. Mi ha detto che stava cercando di copiare un set di file su un set di server diversi. Ma il problema era che non sapeva come ottenerlo senza eseguire più invocazioni di operazioni di copia. Gli ho detto che avrebbe potuto ottenere ciò usando MSBuild Batching. Il raggruppamento è un processo di esecuzione di un'attività (o di una destinazione) su un insieme di elementi (lotti) alla volta. Un batch può anche includere un singolo oggetto. Pertanto, in questo scenario, è necessario eseguire la copia una volta per ciascun server a cui si desidera eseguire la distribuzione. Ho creato un semplice file msbuild che lo dimostra in due modi diversi. Il primo modo utilizza il raggruppamento delle attività, che può essere visto nell'obiettivo Test. E l'altro utilizza il batch di destinazione che può essere visto nel target DoItCore. Ho anche creato un obiettivo pulito, che non ha nulla a che fare con il batching.

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

Il raggruppamento è un argomento avanzato di MSBuild ed è deplorevolmente trascurato. Devo ammettere che sono colpevole di non averne scritto abbastanza io stesso. Ci sono alcune buone risorse di batch, sono elencate di seguito.


Ecco alcuni post di blog relativi al batch che ho pubblicato.

Grazie, Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Se comprendo la convenzione per separarli con ';' rende il parametro una lista piuttosto che un singolo oggetto. Lo controllerò dopo l'orario di lavoro. Grazie –

Problemi correlati