2009-08-18 10 views
16

Ich habe das folgende Stück msbuild Code aufzurufen:Wie die gleiche msbuild Ziel zweimal mit unterschiedlichen Parametern aus msbuild Projektdatei selbst

<PropertyGroup> 
    <DirA>C:\DirA\</DirA> 
    <DirB>C:\DirB\</DirB> 
    </PropertyGroup> 

    <Target Name="CopyToDirA" 
      Condition="Exists('$(DirA)') AND '@(FilesToCopy)' != ''" 
      Inputs="@(FilesToCopy)" 
      Outputs="@(FilesToCopy -> '$(DirA)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirA)" /> 
    </Target> 

    <Target Name="CopyToDirB" 
      Condition="Exists('$(DirB)') AND '@(FilesToCopy)' != ''" 
      Inputs="@(FilesToCopy)" 
      Outputs="@(FilesToCopy -> '$(DirB)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirB)" /> 
    </Target> 

    <Target Name="CopyFiles" DependsOnTargets="CopyToDirA;CopyToDirB"/> 

, damit das Ziel Aufruf CopyFiles kopiert die entsprechenden Dateien zu $(DirA) und $(DirB), vorausgesetzt, sie sind noch nicht da und auf dem neuesten Stand.

Aber die Ziele CopyToDirA und CopyToDirB aussehen identisch außer einer Kopien zu $(DirA) und der andere - zu $(DirB). Ist es möglich, sie zu einem Ziel zusammenzufassen, das zuerst mit $(DirA) und dann mit $(DirB) aufgerufen wird?

Danke.

Antwort

14

Sie sollten in der Lage sein, eine ItemGroup zu generieren, die die Dirs und dann% enthält.

<ItemGroup> 
    <Dirs Include="C:\DirA\;C:\DirB\"> 
</ItemGroup> 
<Target Name="CopyFiles" 
    Condition="Exists('%(Dirs)') AND '@(FilesToCopy)' != ''" 
    Inputs="@(FilesToCopy)" 
    Outputs="@(FilesToCopy -> '%(Dirs)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="%(Dirs)" /> 
</Target> 

Oder Sie können 2 expliziten Anrufe tun:

<Target Name="CopyFiles"> 
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="[email protected](FilesToCopy);DestDir=$(DirA)" /> 
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="[email protected](FilesToCopy);DestDir=$(DirB)" /> 
</Target> 

<Target Name="CopyASetOfFiles" 
    Condition="Exists('$(DestDir)') AND '@(FilesToCopy)' != ''" 
    Inputs="@(FilesToCopy)" 
    Outputs="@(FilesToCopy -> '$(DestDir)%(Filename)%(Extension)')"> 
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DestDir)" /> 
</Target> 

habe ich nicht getestet entweder Syntax, aber ich bin relativ zuversichtlich, die zweite. -

(Die Antwort, wenn es einen gibt, ist in meinem Sayed Hashimi Buch auf meinem Schreibtisch Sie bis zum ersten warten:

  1. Holen Sie sich das Buch
  2. ich langweilig
  3. in MSBuild
  4. Sayed findet diesen Beitrag und kommt mit einer brillanten getestet Antwort auf)
+0

Hallo Ruben. Könnten Sie die ... in Ihrer Antwort erweitern? Ich bin mit parametrisierten Zielen nicht so vertraut, um zu verstehen, was Sie meinen. Vielen Dank. – mark

+0

@mark: fertig.Grund, warum ich es vorher nicht getan habe, ist zweifach 1. Habe keinen netten Editor zur Hand. 2. nicht sicher auf Syntax der ersten Probe. Hoffe das hilft. Ich empfehle das Inside MSBuild Buch –

+0

@ruben: LOL @ # 3 –

4

Ja, was Sie batching aufgerufen werden sollen. Die in den Ausgaben definierten Werte führen dazu, dass diese Aufgabe für jedes Element in der Dirs-Elementgruppe ausgeführt wird.

;%(Dirs.Identity) 

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

<ItemGroup> 
    <Dirs Include="C:\DirA" /> 
    <Dirs Include="C:\DirB" /> 
</ItemGroup> 

<Target Name="CopyFiles" 
    Inputs="@(FilesToCopy);@(Dirs)" 
    Outputs="@(FilesToCopy -> '%(Dirs.Identity)%(Filename)%(Extension)');%(Dirs.Identity)" > 
    <Message Text="%(Dirs.Identity)" /> 
</Target> 

</Project> 

Ausgänge:

Build started 8/19/2009 10:11:57 PM. 
Project "D:\temp\test.proj" on node 0 (default targets). 
    C:\DirA 
CopyFiles: 
    C:\DirB 
Done Building Project "D:\temp\test.proj" (default targets). 

Ändern Sie die Nachricht Aufgabe Aufgabe mit den folgenden Bedingungen zu kopieren und Sie sind fertig:

Condition="Exists('%(Dirs.Identity)') AND '@(FilesToCopy)' != ''"