2010-10-18 18 views
1

Je construis divers projets en utilisant les < MSBuild projets = » ... le balisage. Je suis alors exécutais des outils de ligne de commande après que le projet est construit.MSBuild conditionnel Exec?

Par exemple,

<Target Name="Name"> 
    <MSBuild Projects="" /> 
    <Exec Command="" /> 
</Target> 

Je remarque que le projet est généré uniquement comme requis et obtient la sortie suivante lorsque le script de génération est exécuté: "Ignorer la cible" CoreCompile "car tous les fichiers de sortie sont à jour" .C'est super mais comment puis-je faire mes commandes < Exec ... utiliser la même condition afin de ne les utiliser que lorsque cela est nécessaire?

Mise à jour: J'ai implémenté la suggestion de gregmac mais elle exécute toujours la commande malgré tout. Voilà ce que j'ai maintenant:

<Target Name="Name"> 
<MSBuild Projects=""> 
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> 
</MSBuild> 
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" /> 

Toute autre aide est très appréciée. C'est un peu un point de friction pour moi.

Merci pour tous les conseils.

Alan

Répondre

0

J'ai réussi à trouver une solution pour répondre à mes besoins bien qu'il ne peut pas être la solution optimale.

Voir ma réponse à mon autre question ici: MSBuild Post-Build

Merci, Alan

0

Vous devriez être en mesure d'utiliser le TargetOutputs parameter:

<MSBuild Projects="" > 
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> 
</MSBuild> 
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug --> 
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" /> 
+0

Salut, Merci pour votre suggestion et désolé pour le retard dans la réponse. Je me contente d'essayer ça maintenant. J'ai essayé mais il exécute toujours la commande indépendamment du fait que le projet ait été construit ou non. Voir ma question mise à jour. Des idées? –

+0

Après avoir examiné cela plus loin, je peux voir que AssembliesBuiltByChildProjects contient le nom de mon assembly. Cependant, il n'y a pas de différence dans cette valeur, que le projet soit construit ou non ... C'est un peu frustrant car il est si proche. Quelqu'un peut-il nous éclairer? –

0

Si vous pouvez ajouter ce qui suit à chacun de vos projets:

<Target Name="DoStuffWithNewlyCompiledAssembly"> 
    <Exec Command="" /> 
</Target> 

... vous seulement besoin d'ajouter une propriété:

<Target Name="Name"> 
    <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" /> 
</Target> 

Cela fonctionne parce que quelqu'un intelligent chez Microsoft a ajouté la ligne suivante à la fin de la cible CoreCompile dans Microsoft.[CSharp|VisualBasic][.Core].targets (le nom du fichier dépend de la langue et de la version de MSBuild/Visual Studio).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

Donc, si vous spécifiez un nom de cible dans la propriété TargetsTriggeredByCompilation, votre cible se déroulera si CoreCompile runs-- et votre cible ne fonctionnera pas si CoreCompile est sautée (par exemple parce que l'ensemble de sortie est déjà à To- date par rapport au code).