В чем разница между целями PreBuildEvent, BeforeBuild и BeforeCompile в MSBuild? - PullRequest
44 голосов
/ 08 мая 2011

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

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

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

1 Ответ

87 голосов
/ 08 мая 2011

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

...