50 votes

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

J'ai récemment eu à se déplacer un peu de code à partir d'un PreBuildEvent dans Visual Studio dans le BeforeBuild cible pour le faire fonctionner sur AppHarbor. En le faisant, j'ai aussi remarqué un BeforeCompile cible.

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

Ce qui peut/ne peut pas être fait avec chacun, et pourquoi voudriez-vous choisir un plutôt qu'un autre?

92voto

Bas Bossink Points 4124

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

<!--
============================================================
                                    Build

The main build entry point.
============================================================
-->
<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

Le code est assez gentil pour expliquer l'utilisation de l' BeforeBuild et AfterBuild de la cible dans les commentaires pour les deux cibles.

<!--
============================================================
                                    BeforeBuild

Redefine this target in your project in order to run tasks just before Build
============================================================
-->
<Target Name="BeforeBuild"/>

<!--
============================================================
                                    AfterBuild

Redefine this target in your project in order to run tasks just after Build
============================================================
-->
<Target Name="AfterBuild"/>

Elle est suivie par la définition de l' CoreBuild cible:

<PropertyGroup>
    <CoreBuildDependsOn>
        BuildOnlySettings;
        PrepareForBuild;
        PreBuildEvent;
        ResolveReferences;
        PrepareResources;
        ResolveKeySource;
        Compile;
        UnmanagedUnregistration;
        GenerateSerializationAssemblies;
        CreateSatelliteAssemblies;
        GenerateManifests;
        GetTargetPath;
        PrepareForRun;
        UnmanagedRegistration;
        IncrementalClean;
        PostBuildEvent
    </CoreBuildDependsOn>
</PropertyGroup>

Si l' Build cible est juste un wrapper autour de l' CoreBuild de la cible pour vous permettre d'effectuer les étapes personnalisées juste avant ou après l' CoreBuild de la cible. Comme peut être vu au-dessus de l' PreBuildEvent et PostBuildEvent sont listés comme des dépendances de l' CoreBuild de la cible. Les dépendances de l' Compile de la cible sont définis comme suit:

<PropertyGroup>
    <CompileDependsOn>
        ResolveReferences;
        ResolveKeySource;
        SetWin32ManifestProperties;
        _GenerateCompileInputs;
        BeforeCompile;
        _TimeStampBeforeCompile;
        CoreCompile;
        _TimeStampAfterCompile;
        AfterCompile
    </CompileDependsOn>
</PropertyGroup>

Nouveau BeforeCompile et AfterCompile font l'objet de commentaires dans le code:

<!--
============================================================
                                    BeforeCompile

Redefine this target in your project in order to run tasks just before Compile.
============================================================
-->
<Target Name="BeforeCompile"/>

<!--
============================================================
                                    AfterCompile

Redefine this target in your project in order to run tasks just after Compile.
============================================================
-->
<Target Name="AfterCompile"/>

Compte tenu de cette information, je ne sais pas pourquoi AppHarbor ne prend pas en charge Pre-, PostBuildEvent tandis que l' Build peut être modifié à l'aide d' Before-, AfterBuild.

Le choix de ce qui Target de remplacer pour qui le scénario dépend du moment, au cours de la génération à laquelle vous souhaitez effectuer votre tâche donnée. Les cibles n'ont pas de restrictions et/ou des avantages à ce qu'ils peuvent accomplir. Outre le fait qu'ils puissent s' ItemGroup's ou des propriétés qui ont été définis/rempli par les étapes précédentes.

À l'aide de nuget à apporter dans des paquets est probablement préférable d'effectuer avant de la construire essaie de résoudre les projets de dépendances. Donc, BeforeCompile n'est pas un bon candidat pour ce type d'action.

J'espère que cela jette une certaine lumière sur la question. Trouvé une autre belle explication sur MSDN

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X