2009-08-18 7 views
16

je la pièce de code suivante msbuild:Comment appeler le même fichier projet cible avec des paramètres différents de l'intérieur msbuild deux fois msbuild se

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

donc invoquer la cible CopyFiles copie les fichiers pertinents à $(DirA) et $(DirB), pourvu qu'ils ne soient pas déjà là et à jour.

Mais les cibles CopyToDirA et CopyToDirB semblent identiques sauf une copies à $(DirA) et l'autre - à $(DirB). Est-il possible de les unifier en une première cible invoquée avec $(DirA) puis avec $(DirB)?

Merci.

Répondre

14

Vous devriez être capable de générer un ItemGroup contenant les Dirs, puis% sur cela.

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

Ou vous pouvez faire 2 appels explicites:

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

Je ne l'ai pas testé soit la syntaxe, mais je suis relativement plus confiant du second.

(La réponse, s'il y en a un, est dans mon livre Sayed Hashimi sur mon bureau - vous devrez attendre la première:

  1. Obtenez le livre
  2. je me ennuie
  3. Sayed trouve ce poste et arrive avec une réponse brillante testée)
+0

Salut Ruben. Pourriez-vous développer le ... dans votre réponse? Je ne connais pas très bien les objectifs paramétrés pour comprendre ce que vous voulez dire. Merci. – mark

+0

@mark: terminé.La raison pour laquelle je ne l'ai pas fait avant est double: 1. N'avait pas un bon éditeur à portée de main. 2. Je ne suis pas sûr de la syntaxe du premier échantillon. J'espère que cela t'aides. Je recommande fortement le livre Inside MSBuild –

+0

@ruben: LOL @ # 3 –

4

Oui, ce que vous voulez que l'on appelle dans MSBuild batching. Le

;%(Dirs.Identity) 

définis dans les sorties provoquera cette tâche à exécuter pour chaque élément dans la Dirs ItemGroup.

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

Sorties:

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

Changer la tâche du message à copier tâche avec la condition suivante et vous fait:

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