Ответ на этот вопрос можно найти в файле Microsoft.Common.targets
, который можно найти (в зависимости от того, используете ли вы 64-битную или 32-битную среду) в: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.target
для 64-битной и C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets
для 32-разрядной среды выполнения.Этот файл определяет все этапы сборки вашего проекта.Цитируя источник:
<!--
============================================================
Build
The main build entry point.
============================================================
-->
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Код достаточно хорош, чтобы объяснить использование цели BeforeBuild
и AfterBuild
в комментариях для обеих целей.
<!--
============================================================
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"/>
Этос последующим определением цели CoreBuild
:
<PropertyGroup>
<CoreBuildDependsOn>
BuildOnlySettings;
PrepareForBuild;
PreBuildEvent;
ResolveReferences;
PrepareResources;
ResolveKeySource;
Compile;
UnmanagedUnregistration;
GenerateSerializationAssemblies;
CreateSatelliteAssemblies;
GenerateManifests;
GetTargetPath;
PrepareForRun;
UnmanagedRegistration;
IncrementalClean;
PostBuildEvent
</CoreBuildDependsOn>
</PropertyGroup>
Таким образом, цель Build
- это просто оболочка вокруг цели CoreBuild
, позволяющая выполнять пользовательские действия непосредственно перед или после CoreBuild
цель.Как видно выше, PreBuildEvent
и PostBuildEvent
перечислены как зависимости цели CoreBuild
.Зависимости цели Compile
определены следующим образом:
<PropertyGroup>
<CompileDependsOn>
ResolveReferences;
ResolveKeySource;
SetWin32ManifestProperties;
_GenerateCompileInputs;
BeforeCompile;
_TimeStampBeforeCompile;
CoreCompile;
_TimeStampAfterCompile;
AfterCompile
</CompileDependsOn>
</PropertyGroup>
Снова BeforeCompile
и AfterCompile
комментируются в коде:
<!--
============================================================
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"/>
Учитывая эту информацию, я делаюне знаю, почему AppHarbor не поддерживает Pre-, PostBuildEvent
, а Build
можно изменить с помощью Before-, AfterBuild
.
Выбор того, какой Target
переопределить для какого сценария, зависит от момента во время сборки, в который вы хотите выполнить данное задание.Цели не имеют конкретных ограничений и / или преимуществ в отношении того, что они могут достичь.Помимо того, что они могут адаптировать ItemGroup
или свойства, которые были определены / заполнены предыдущими шагами.
Использование nuget для загрузки пакетов, вероятно, лучше всего выполнить до того, как сборка попытается разрешить зависимости проектов.Так что BeforeCompile
не является хорошим кандидатом для такого рода действий.
Я надеюсь, что это проливает некоторый свет на этот вопрос.Нашел еще одно приятное объяснение на MSDN