Ответ 1
Ответ на этот вопрос можно найти в файле 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