Подтвердить что ты не робот

В чем разница между целью PreBuildEvent, BeforeBuild и целевым объектом BeforeCompile в MSBuild?

Мне недавно пришлось перенести некоторый код из PreBuildEvent в Visual Studio в цель BeforeBuild, чтобы он работал над AppHarbor. При этом я также заметил цель BeforeCompile.

В чем разница между этими тремя кажущимися похожими событиями: PreBuildEvent, BeforeBuild Target, BeforeCompileTarget?

Что делать/не может быть сделано с каждым, и почему вы выбираете один за другим?

4b9b3361

Ответ 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