2009-07-11 11 views
14

J'ai configuré plusieurs cibles dans un seul fichier xml. Je m'attends à ce que toutes les cibles soient exécutées mais seule la première cible est exécutée.Pourquoi MSBuild n'exécute-t-il pas plusieurs cibles?

est ici une version simplifiée de ce iam essayant de faire:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="T1"> 
    <Copy SourceFiles="c:\temp\a.txt" DestinationFolder="C:\temp2\" />  
    </Target> 
    <Target Name="T2"> 
    <Copy SourceFiles="c:\temp\b.txt" DestinationFolder="C:\temp2\" />  
    </Target> 
</Project> 

Je suis en cours d'exécution de la construction du TeamCity CI Server et les journaux des rapports code de sortie du processus: 0.

Quelqu'un at-il des idées pourquoi il ne fonctionne pas T2?

Répondre

28

Vous devez dire MSBuild sur vos cibles multiples

Essayez

<Target Name="Build" DependsOnTargets="T1; T2"> 
</Target> 
+2

Merci pour le pointeur, en fait je l'ai eu à travailler en spécifiant:

+0

Notez que les cibles dépendantes doivent être séparées par un point-virgule, pas une virgule comme indiqué. Par exemple. Kildareflare

17

MSBuild vous permet de définir une cible par défaut et il vous permet de définir des dépendances entre vos cibles. Si aucune valeur par défaut n'est définie, alors elle exécute la première qu'elle trouve. En utilisant DefaultTargets vous pouvez appeler multiple:

<Project DefaultTargets="T1;T2"> 

Une cible doit accomplir toutes les étapes bien définies. Par exemple, une cible propre supprimerait tous les fichiers et dossiers nécessaires pour nettoyer le projet. Compiler compilerait toutes les DLL, etc.

Vos cibles déclarerait normalement leurs propres dépendances:

<Target Name="CI" DependsOnTargets="T1, T2"> 
</Target> 

Sinon, votre cible doit contenir toutes les étapes individuelles que vous souhaitez exécuter:

<Target Name="XX"> 
    <CallTarget Targets="T1"/> 
    <CallTarget Targets="T2"/> 
</Target> 
2

MSBuild utilise cet ordre pour déterminer quelles cibles doivent être exécutées. Une fois qu'une valeur est trouvée, elle s'arrête là et commence l'exécution.

  • La cible (s) que vous spécifiez à l'aide du commutateur/t sur MSBuild.exe
  • Les cibles (s) contenus dans les DefaultTargets attribut sur l'élément projet
  • La première cible qui se trouve dans la script de construction (légèrement morecomplicated fait)

Comme l'intervenant précédent dit que vous pouvez utiliser la liste des DependsOnTargets d'avoir d'autres cibles exécutent avant de cette cible. À propos de votre solution, AfterTargets est uniquement disponible dans MSBuild 4.0, ce qui ne fonctionnera pas avec les versions précédentes.

Sayed Ibrahim Hashimi

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

0

Sinon, vous pouvez créer un groupe de propriété qui définit toutes les cibles dépendantes:

<PropertyGroup> 
     <BuildDependsOn>T1;T2</BuildDependsOn> 
</PropertyGroup> 

et passer la valeur de BuildDependsOn comme un paramètre comme indiqué ci-dessous:

<Target Name="Build" DependsOnTargets="@(BuildDependsOn)"/> 

Cette approche permet à la liste dépendante d'être modifiée en dehors de ce fichier de projet pour injecter d'autres étapes requises. Voir ce site pour plus d'informations.

Questions connexes