Quelle est la différence entre une cible PreBuildEvent, BeforeBuild et BeforeComstack dans MSBuild?

J’ai récemment dû déplacer du code d’un PreBuildEvent dans Visual Studio vers la cible BeforeBuild pour le faire fonctionner sur AppHarbor . Ce faisant, j’ai également remarqué une cible BeforeComstack.

Quelle est la différence entre ces trois événements apparemment similaires: PreBuildEvent, BeforeBuild Target, BeforeComstackTarget?

Que peut-on / ne peut-on pas faire avec chacun et pourquoi en choisiriez-vous un autre?

La réponse à cette question peut être trouvée dans le fichier Microsoft.Common.targets qui peut être trouvé (selon que vous utilisez le framework 64 bits ou 32 bits) à: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.target pour 64 bits et C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets pour le moteur d’exécution 32 bits. Ce fichier définit toutes les étapes d’une construction de votre projet. Citant la source:

    BeforeBuild; CoreBuild; AfterBuild   

Le code est assez agréable pour expliquer l’utilisation de la cible BeforeBuild et AfterBuild dans les commentaires pour les deux cibles.

     

Ceci est suivi par la définition de la cible CoreBuild :

   BuildOnlySettings; PrepareForBuild; PreBuildEvent; ResolveReferences; PrepareResources; ResolveKeySource; Comstack; UnmanagedUnregistration; GenerateSerializationAssemblies; CreateSatelliteAssemblies; GenerateManifests; GetTargetPath; PrepareForRun; UnmanagedRegistration; IncrementalClean; PostBuildEvent   

Ainsi, la cible Build est simplement une enveloppe autour de la cible CoreBuild pour vous permettre d’effectuer des étapes personnalisées juste avant ou après la cible CoreBuild . Comme on peut le voir ci-dessus, PreBuildEvent et PostBuildEvent sont répertoriés comme dépendances de la cible CoreBuild . Les dépendances de la cible Comstack sont définies comme suit:

   ResolveReferences; ResolveKeySource; SetWin32ManifestProperties; _GenerateComstackInputs; BeforeComstack; _TimeStampBeforeComstack; CoreComstack; _TimeStampAfterComstack; AfterComstack   

Encore BeforeComstack fois, BeforeComstack et AfterComstack sont commentés dans le code:

     

Compte tenu de ces informations, je ne sais pas pourquoi AppHarbor ne supporte pas Pre-, PostBuildEvent alors que la Build peut être modifiée avec Before-, AfterBuild .

Le choix de la Target à remplacer pour quel scénario dépend du moment de la construction à laquelle vous souhaitez exécuter la tâche que vous souhaitez effectuer. Les cibles n’ont pas de ressortingctions et / ou d’avantages spécifiques quant à ce qu’elles peuvent accomplir. Outre le fait qu’ils peuvent adapter les propriétés ou les propriétés ItemGroup définies / remplies par les étapes précédentes.

Il est probablement préférable d’utiliser nuget pour importer les packages avant que la génération ne tente de résoudre les dépendances des projets. So BeforeComstack n’est pas un bon candidat pour ce type d’action.

J’espère que cela éclaire un peu la question. J’ai trouvé une autre bonne explication sur MSDN