web-dev-qa-db-ja.com

MSBuildのPreBuildEvent、BeforeBuildターゲット、BeforeCompileターゲットの違いは何ですか?

最近、いくつかのコードを Visual StudioのPreBuildEventをBeforeBuildターゲットに移動して、AppHarborで機能させる必要がありました 。そうしていると、BeforeCompileターゲットにも気づきました。

PreBuildEvent、BeforeBuild Target、BeforeCompileTargetの3つの一見似ているイベントの違いは何ですか?

それぞれで何ができる/できないのか、そしてなぜあなたはお互いを選ぶのですか?

50
Danny Tuppeny

この質問への回答は、_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ターゲットの直前または直後にカスタムステップを実行できるようにします。上記のように、PreBuildEventPostBuildEventCoreBuildターゲットの依存関係としてリストされています。 Compileターゲットの依存関係は次のように定義されています。

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

再びBeforeCompileAfterCompileはコードでコメント化されています:

_<!--
============================================================
                                    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 [〜#〜] に別の素晴らしい説明が見つかりました

88
Bas Bossink