Konfigurace cílů a úloh

Vybrané úlohy NÁSTROJE MSBuild lze nastavit tak, aby běžely v cílovém prostředí, když vývojový počítač podporuje cílové prostředí. Když například použijete 64bitový počítač s Windows k sestavení aplikace, která cílí na 32bitovou architekturu Systému Windows, pak se vybrané úlohy spustí v 32bitovém procesu.

Poznámka:

Pokud je úloha sestavení napsaná v jazyce .NET, jako je Visual C# nebo Visual Basic, a nepoužívá nativní prostředky nebo nástroje, spustí se v libovolném cílovém kontextu bez přizpůsobení.

UsingTask – atributy a parametry úkolu

UsingTask Následující atributy ovlivňují všechny operace úlohy v konkrétním procesu sestavení:

  • AtributRuntime, pokud je k dispozici, nastaví verzi modulu CLR (Common Language Runtime) a může mít některou z těchto hodnot: CLR2, , CLR4nebo CurrentRuntime* (jakýkoli modul runtime).

  • Atribut Architecture , pokud je k dispozici, nastaví platformu a bitness a může mít některou z těchto hodnot: x86, x64, , CurrentArchitecturenebo * (libovolnou architekturu).

  • Atribut TaskFactory , pokud je k dispozici, nastaví objekt pro vytváření úloh, který vytváří a spouští instanci úlohy, a přebírá pouze hodnotu TaskHostFactory. Další informace naleznete v části Továrny úloh dále v tomto dokumentu.

<UsingTask TaskName="SimpleTask"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />

Můžete také použít MSBuildRuntime parametry a MSBuildArchitecture nastavit cílový kontext vyvolání jednotlivých úkolů.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

Než nástroj MSBuild spustí úlohu, vyhledá shodu UsingTask , která má stejný cílový kontext. Parametry, které jsou zadány v UsingTask odpovídající úloze, ale ne v odpovídající úloze, jsou považovány za odpovídající. Parametry zadané v úkolu, ale ne v odpovídajících UsingTask parametrech, se také považují za vyhovující. Pokud hodnoty parametrů nejsou zadány v úkolu UsingTask nebo v úkolu, hodnoty jsou výchozí ( * jakýkoli parametr).

Upozorňující

Pokud existuje více než jeden UsingTask a všechny mají odpovídající TaskName, Runtimea Architecture atributy, první, který se má vyhodnotit, nahradí ostatní. Liší se od chování Property prvků a Target chování.

Pokud jsou parametry nastaveny pro úlohu, nástroj MSBuild se pokusí najít UsingTask , který odpovídá těmto parametrům, nebo alespoň není v konfliktu s nimi. Cílový kontext stejného úkolu může zadat více než jeden UsingTask . Například úloha, která má různé spustitelné soubory pro různá cílová prostředí, se může podobat tomuto:

<UsingTask TaskName="MyTool"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

Přepsání výchozích hodnot UsingTasks

Ve výchozím nastavení nástroj MSBuild zpracovává usingTask jako první vyhrává. Počínaje verzí 17.2 nástroj MSBuild podporuje přepsání tohoto chování prostřednictvím parametru Override . A UsingTask se sadou true parametrů Override bude mít prioritu před všemi ostatními UsingTask stejného TaskName.

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    Override="true"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

Upozorňující

To lze provést pouze jednou pro každý úkol. Sestavení, která se pokusí přidat více přepsání pro stejnou úlohu, obdrží chybu MSB4275MSBuild .

Objekty pro vytváření úloh

Následující tabulka ukazuje továrny úloh poskytované instalací nástroje MSBuild:

Objekt pro vytváření úloh Popis
AssemblyTaskFactory Tato hodnota je výchozí. Spustí úlohu v procesu.
TaskHostFactory Spustí úkol mimo proces.
RoslynCodeTaskFactory Pro vložené úkoly napsané v jazyce C# nebo Visual Basic a cílení na .NET Standard; funguje s oběma msbuild.exe a dotnet build.
CodeTaskFactory Pro vložené úlohy napsané v jazyce C# nebo Visual Basic a cílení na rozhraní .NET Framework; funguje pouze s msbuild.exe.

Mechanismus vytváření úloh je rozšiřitelný, takže můžete použít také ty, které vytvořily třetí strany, nebo si vytvořit vlastní. Důvodem pro vytvoření je podpora jiného jazyka pro psaní vložených úkolů.

TaskHostFactory

Před spuštěním úlohy nástroj MSBuild zkontroluje, jestli je určen ke spuštění v aktuálním kontextu softwaru. Pokud je úkol tak určený, nástroj MSBuild ho předá do objektu AssemblyTaskFactory, který ho spustí v aktuálním procesu; v opačném případě nástroj MSBuild předá úlohu , která spustí úlohu TaskHostFactoryv procesu, který odpovídá cílovému kontextu. I když se aktuální kontext a cílový kontext shodují, můžete úlohu vynutit, aby došlo k výpadku procesu (z důvodu izolace, zabezpečení nebo jiných důvodů) nastavením TaskFactory na TaskHostFactoryhodnotu .

<UsingTask TaskName="MisbehavingTask"
    TaskFactory="TaskHostFactory"
    AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>

Pokud TaskHostFactory je zadán explicitně, proces, který spouští úlohu, je krátkodobý. Operační systém tak může okamžitě po spuštění vyčistit všechny prostředky související s úlohou. Z tohoto důvodu určete TaskHostFactory při odkazování na úlohy integrované ve stejném procesu sestavení jako jejich použití, aby se zabránilo chybám použití souborů při aktualizaci sestavení úloh po sestavení sestavení.

RoslynCodeTaskFactory

Poskytuje RoslynCodeTaskFactory mechanismus, pomocí kterého můžete napsat kód jazyka C# nebo Visual Basic pro úkol v souboru projektu pro okamžité použití. Kód se zkompiluje během procesu sestavení a vytvoří úlohu, kterou můžete spustit ve stejném sestavení. Kód, který napíšete, cílí na .NET Standard, takže ho můžete použít při spuštění dotnet build, který používá verzi .NET Core (a .NET 5 a novější) nástroje MSBuild a také msbuild.exe, která používá rozhraní .NET Framework. RoslynCodeTaskFactory je nejvhodnější pro přizpůsobení, které je v logice NÁSTROJE MSBuild příliš obtížné, ale není dostatečně složité vytvořit samostatný projekt. Viz Vytvoření vložené úlohy MSBuild pomocí RoslynCodeTaskFactory.

CodeTaskFactory

CodeTaskFactory je starší verze RoslynCodeTaskFactory , která je omezena na verzi rozhraní .NET Framework nástroje MSBuild. Viz vložené úlohy nástroje MSBuild. Tato továrna úloh je podporovaná, ale novější kód by se měl použít RoslynCodeTaskFactory pro širší použitelnost.

Parametry fantomového úkolu

Stejně jako jakékoli jiné parametry MSBuildRuntime úlohy a MSBuildArchitecture lze je nastavit z vlastností sestavení.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <FrameworkVersion>3.0</FrameworkVersion>
    </PropertyGroup>
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

Na rozdíl od jiných parametrů úkolu a MSBuildArchitecture není zřejmé, MSBuildRuntime že samotný úkol. Chcete-li napsat úlohu, která je si vědoma kontextu, ve kterém běží, musíte buď otestovat kontext voláním rozhraní .NET Framework, nebo pomocí vlastností sestavení předat informace o kontextu prostřednictvím jiných parametrů úlohy.

Poznámka:

UsingTask atributy lze nastavit ze sady nástrojů a vlastností prostředí.

MSBuildArchitecture Parametry MSBuildRuntime poskytují nejflexibilnější způsob nastavení cílového kontextu, ale také nejvíce omezeného rozsahu. Na jedné straně, protože jsou nastaveny na samotné instanci úlohy a nejsou vyhodnoceny, dokud se úkol nespustí, mohou odvodit hodnotu z úplného rozsahu vlastností dostupných v době vyhodnocení i v době sestavení. Na druhou stranu se tyto parametry vztahují pouze na konkrétní instanci úlohy v konkrétním cíli.

Poznámka:

Parametry úlohy se vyhodnocují v kontextu nadřazeného uzlu, ne v kontextu hostitele úkolu. Proměnné prostředí, které jsou závislé na modulu runtime nebo architektuře (například umístění Program Files ), se vyhodnotí jako hodnota, která odpovídá nadřazeného uzlu. Pokud je však stejná proměnná prostředí přečtená přímo úkolem, vyhodnotí se správně v kontextu hostitele úlohy.