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?
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 MSDNWarning: 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