2009-05-29 6 views

Répondre

8

Voici un exemple concret que je mets ensemble qui montre ce que vous recherchez:

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

Super. Merci, les commentaires le rendent très clair. Je sais que je pourrais paraître un peu superficiel si je dis que je ne cherche pas à devenir un gourou MSBuild, plutôt que de résoudre mon problème ici. J'ai remarqué qu'en utilisant une technologie au cas par cas, il y a un point dans une courbe d'apprentissage où vous avez assez de connaissances éparses pour qu'une étude complète à partir de zéro soit beaucoup plus facile et place tout à sa place. Je trouve que c'est souvent la façon la plus préférable d'apprendre quelque chose. –

+1

Si vous n'avez pas besoin de tout savoir maintenant, cela fonctionne très bien. J'ai corrigé une erreur dans l'exemple (désolé à ce sujet). Vous devez appeler toutes les tâches (comme copier) dans une cible. Je l'ai mis dans une cible. Vous appelez appel MSBuild avec ce nom de cible (CopyFiles) et il exécutera la cible. – Vaccano

0

Il est préférable de le faire vous-même comme un exercice d'apprentissage, plutôt que de traiter MSBUILD comme une boîte magique. This article from Patrick Smacchia vous donne la plupart des techniques impliquées.

+0

Je suis en train d'essayer de me familiariser avec MSBuild en essayant d'automatiser plusieurs tâches que je l'ai fait manuellement jusqu'à ce jour. J'ai lu plusieurs tutoriels similaires à celui auquel vous faites référence (il semble que ce soit un copier coller à gogo). Ce faisant, j'essaie de me familiariser avec la syntaxe et les possibilités intégrées. Pourriez-vous préciser comment je le traite comme une boîte magique et comment votre article référé peut m'éclairer? –

+0

Salut Boris, je ne voulais pas dire le "traiter comme une boîte noire" comme vous êtes paresseux. Je pensais principalement à mon apprentissage de msbuild - j'avais l'habitude d'essayer de comprendre une tâche à la fois, mais pas l'image globale. J'ai vraiment trouvé que l'article de Smacchia était quelque chose que j'aurais aimé avoir une semaine avant que je l'obtienne - En tant qu'auteur de NDepend, il n'est pas un marchand de boutures. Pour ce qui est de la définition de la liste, j'imagine qu'une propriété [liste xml] fonctionnerait pour la liste, et que vous utiliseriez la tâche Copier avec la fonction de mise en boucle/générique de liste pour parcourir la liste. Je ne l'ai pas fait moi-même sinon je collerais un échantillon. –

+0

Merci pour votre réponse. J'aurai un second regard approfondi sur l'article. –

2

Le concept que vous devriez être intéressé par est connu sous le nom Batching.

J'ai couvert ce scénario exact sur mon blog à http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx

Voici le texte de cette entrée de blog, vous pouvez télécharger les fichiers mentionnés sur le lien ci-dessus.


Aujourd'hui quelqu'un me parlait d'un collègue qui avait des problèmes avec MSBuild. Il m'a dit qu'il essayait de copier un ensemble de fichiers sur un ensemble de serveurs différents. Mais le problème était qu'il ne savait pas comment y parvenir sans effectuer plusieurs invocations de tâches de copie. Je lui ai dit qu'il pourrait y parvenir en utilisant MSBuild Batching. Le traitement par lots est un processus d'exécution d'une tâche (ou d'une cible) sur un ensemble d'éléments (lots) à la fois. Un lot peut également inclure un seul article. Donc, dans ce scénario, nous devons effectuer la copie une fois pour chaque serveur sur lequel il voulait se déployer. J'ai créé un fichier msbuild simple qui illustre cela de deux manières différentes. La première utilise le batching de tâches, qui peut être vu dans la cible Test. Et l'autre utilise le traitement par lots Target qui peut être vu dans la cible DoItCore. J'ai également créé une cible propre, qui n'a rien à voir avec le traitement par lots. Batching est un sujet avancé de MSBuild, et est définitivement négligé. Je dois admettre que je suis coupable de ne pas en avoir assez écrit moi-même. Il y a quelques bonnes ressources de traitement par lots, elles sont énumérées ci-dessous.


Voici d'autres entrées de blog liées au batching que j'ai publiées.

Merci, Sayed Ibrahim Hashimi

Mon livre: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Si je comprends bien la convention pour les séparer avec ';' rend le paramètre une liste plutôt qu'un seul élément. Je vais vérifier cela après les heures de travail. Merci –

Questions connexes