Jaka jest różnica między PreBuildEvent, beforebuild target i BeforeCompile target w MSBuild?

Ostatnio musiałem przenieść kod z PreBuildEvent w Visual Studio do celu BeforeBuild, aby działał na AppHarbor . Przy okazji zauważyłem również cel przed Kompilem.

Jaka jest różnica między tymi trzema pozornie podobnymi zdarzeniami: PreBuildEvent, BeforeBuild Target, BeforeCompileTarget?

Co można/nie można zrobić z każdym i dlaczego wybrać jeden nad drugim?

Author: Dan, 2011-05-08

1 answers

Odpowiedź na to pytanie można znaleźć w pliku Microsoft.Common.targets, który można znaleźć (w zależności od tego, czy używasz 64-bitowego lub 32-bitowego frameworka) pod adresem: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.target dla 64-bitowego i C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets dla 32-bitowego środowiska wykonawczego. Ten plik definiuje wszystkie kroki, jakie przechodzi Budowa twojego projektu. Cytując źródło:

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

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

Kod jest wystarczająco ładny, aby wyjaśnić użycie celu BeforeBuild i AfterBuild w komentarzach dla obu celów.

<!--
============================================================
                                    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"/>

Po tym następuje definicja CoreBuild cel:

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

Więc cel Build jest tylko owijką wokół celu CoreBuild, aby umożliwić wykonywanie niestandardowych kroków tuż przed lub po celu CoreBuild. Jak widać powyżej PreBuildEvent i PostBuildEvent są wymienione jako zależności celu CoreBuild. Zależności celu Compile są zdefiniowane w następujący sposób:

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

Ponownie BeforeCompile i AfterCompile są komentowane w kodzie:

<!--
============================================================
                                    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"/>

Biorąc pod uwagę te informacje Nie wiem, dlaczego AppHarbor nie obsługuje Pre-, PostBuildEvent podczas Build można modyfikować za pomocą Before-, AfterBuild.

Wybór, który Target nadpisać dla którego scenariusza zależy od momentu podczas budowania, w którym chcesz wykonać dane zadanie. Cele nie mają konkretnych ograniczeń i / lub korzyści co do tego, co mogą osiągnąć. Oprócz tego, że mogą dostosować ItemGroup ' s lub właściwości, które zostały zdefiniowane / wypełnione przez poprzednie kroki.

Używanie nuget do sprowadzania pakietów jest prawdopodobnie najlepiej wykonywane zanim kompilator spróbuje rozwiąż zależności projektów. Więc {[18] } nie jest dobrym kandydatem do tego rodzaju działań.

Mam nadzieję, że to rzuci trochę światła na tę sprawę. Znalazłem inne miłe Wyjaśnienie na MSDN
 95
Author: Bas Bossink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-15 20:14:46