2010-11-26 27 views
4

J'ai un script MSBuild qui fait à peu près tout ce que j'ai besoin de faire en dehors de mon étape de post-construction (voir une question précédente que j'ai posée: MSBuild conditional Exec?). Ce que je cherche à faire est de construire de nombreux fichiers csproj et optionnellement effectuer des étapes post-construction si et seulement si le projet a été construit. Je ne veux pas effectuer mon étape de post-construction tout le temps, sinon l'horodatage de ma sortie finale sera modifié inutilement (et cela rend le processus de construction très long, sans raison).MSBuild Post-Build

Dans mon script MSBuild j'ai quelque chose comme ce qui suit pour chacun de mes fichiers csproj:

<Target Name="ProjectName"> 
    <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" /> 
</Target> 

Edit: Je pense que ce que je veux vraiment faire est de détecter lors de l'exécution de la tâche CoreCompile pour chaque projet. S'il y avait un moyen de vérifier cela dans une condition?

Des idées? Je suis nouveau sur MSBuild alors peut-être que je suis complètement sur la mauvaise piste!

Merci, Alan

Répondre

1

Après beaucoup de recherche d'une solution simple à ce problème, je ne trouve pas et a fini par venir avec une solution de mon propre qui fonctionne, mais peut-être pas la meilleure solution. Cependant, je voulais partager avec quelqu'un d'autre qui a le même problème afin que vous puissiez au moins avoir une solution de travail et, espérons-le, vous épargnant beaucoup de head banging. Pour récapituler, ce que je voulais faire était de lancer un outil en ligne de commande après la construction de mon projet, mais seulement si l'assemblage était mis à jour (c'est-à-dire l'horodatage modifié). Je ne voulais pas mettre cela dans la section post-construction de chaque projet car je voulais seulement que la post-construction se produise sur notre serveur de construction (pas sur les machines de développement).

Je n'ai trouvé aucun moyen de le faire de manière externe dans mon fichier .proj principal et j'ai fini par modifier la section post-construction de chaque fichier .csproj. Cependant, je préfixées avec une condition if quelque chose comme ceci:

if '$(ExecuteCommand)' == 'true' command.exe 

Cela signifie que la commande ne sera jamais exécutée sur la machine de développement, mais quand j'invoque la construction de mon dossier .proj je peux mettre le drapeau à vrai comme ceci:

<!-- Define common properties --> 
<PropertyGroup> 
    <ExecuteCommand>true</ExecuteCommand> 
</PropertyGroup> 

<Target Name="YourTarget"> 
    <!-- Build project --> 
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" /> 
</Target> 

comme je l'ai dit, je ne pense pas que ce soit la solution la plus élégante, mais cela fonctionne certainement et sera suffisant pour moi pour le moment. Cependant, je serais toujours intéressé d'entendre ce que la bonne façon d'y parvenir est que je puisse améliorer mon script.

Merci, Alan

2

vous pouvez aussi le faire en fonction de la configuration sélectionnée dans votre processus de construction. Pour CI, vous devriez toujours utiliser « Release » ou « Production » (vous pouvez définir votre propre)

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/> 
0

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

<Target Name="DoStuffWithNewlyCompiledAssembly"> 
    <Exec Command="command.exe" /> 
</Target> 

...alors vous ne devez ajouter une propriété:

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

Cela fonctionne parce que quelqu'un d'intelligent à 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 MSBuild/Version 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).