最近、いくつかのコードを Visual StudioのPreBuildEventをBeforeBuildターゲットに移動して、AppHarborで機能させる必要がありました 。そうしていると、BeforeCompileターゲットにも気づきました。
PreBuildEvent、BeforeBuild Target、BeforeCompileTargetの3つの一見似ているイベントの違いは何ですか?
それぞれで何ができる/できないのか、そしてなぜあなたはお互いを選ぶのですか?
この質問への回答は、_Microsoft.Common.targets
_ファイルにあります(64ビットまたは32ビットフレームワークのどちらを使用しているかによって異なります):_C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.target
_ for64ビットおよび32ビットランタイムの場合は_C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets
_。このファイルは、プロジェクトのビルドが実行するすべてのステップを定義します。ソースの引用:
_<!--
============================================================
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"/>
_
この情報があれば、Build
を_Pre-, PostBuildEvent
_を使用して変更できるのに、なぜAppHarborが_Before-, AfterBuild
_をサポートしないのかわかりません。
どのシナリオでどのTarget
をオーバーライドするかは、ビルド中の特定のタスクを実行する瞬間によって異なります。ターゲットには、達成できることに関して特定の制限や利点はありません。前の手順で定義/入力されたItemGroup
またはプロパティを適応できるという事実は別として。
Nugetを使用してパッケージを取り込むのは、ビルドがプロジェクトの依存関係を解決しようとする前に実行するのがおそらく最善です。したがって、BeforeCompile
はこの種のアクションの適切な候補ではありません。
これが問題にいくらかの光を当てることを願っています。 [〜#〜] msdn [〜#〜] に別の素晴らしい説明が見つかりました