Vložené úlohy nástroje MSBuild
Úlohy NÁSTROJE MSBuild jsou obvykle vytvořeny kompilací třídy, která implementuje ITask rozhraní. Další informace najdete v tématu Úkoly.
Počínaje rozhraním .NET Framework verze 4 můžete v souboru projektu vytvářet úkoly vložené do souboru projektu. Pro hostování úlohy nemusíte vytvářet samostatné sestavení. To usnadňuje sledování zdrojového kódu a usnadňuje nasazení úlohy. Zdrojový kód je integrovaný do skriptu.
V MSBuild 15.8 byl přidán RoslynCodeTaskFactory. Pro aktuální vývoj nezapomeňte použít RoslynCodeTaskFactory, nikoli CodeTaskFactory. CodeTaskFactory podporuje pouze verze jazyka C# až 4.0.
Struktura vloženého úkolu
Vložený úkol je obsažen Pomocí UsingTask elementu. Vložený úkol a UsingTask
prvek, který ho obsahuje, jsou obvykle zahrnuty do souboru .targets a podle potřeby importovány do jiných souborů projektu. Tady je základní vložený úkol. Všimněte si, že nic nedělá.
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task does nothing. -->
<UsingTask
TaskName="DoNothing"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Reference Include="" />
<Using Namespace="" />
<Code Type="Fragment" Language="cs">
</Code>
</Task>
</UsingTask>
</Project>
Prvek UsingTask
v příkladu má tři atributy, které popisují úkol a vloženou úlohu továrnu, která ji zkompiluje.
Atribut
TaskName
v tomto případěDoNothing
pojmenuje úkol .Atributy
TaskFactory
pojmenují třídu, která implementuje vloženou úlohu factory.Atribut
AssemblyFile
poskytuje umístění vloženého objektu pro vytváření úloh. Alternativně můžete pomocí atributuAssemblyName
zadat plně kvalifikovaný název vložené třídy objektu pro vytváření úloh, která je obvykle umístěna v$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll
.
Zbývající prvky DoNothing
úkolu jsou prázdné a jsou k dispozici pro ilustraci pořadí a struktury vloženého úkolu. Robustnější příklad je uveden dále v tomto tématu.
Prvek
ParameterGroup
je nepovinný. Při zadání deklaruje parametry pro úlohu. Další informace o vstupních a výstupních parametrech najdete v části Vstupní a výstupní parametry dále v tomto tématu.Prvek
Task
popisuje a obsahuje zdrojový kód úkolu.Element
Reference
určuje odkazy na sestavení .NET, která používáte v kódu. To je ekvivalentem přidání odkazu na projekt v sadě Visual Studio. AtributInclude
určuje cestu odkazovaného sestavení.Tento
Using
prvek obsahuje seznam oborů názvů, ke kterým chcete získat přístup. Podobá seUsing
tomu příkaz v jazyce Visual C#. AtributNamespace
určuje obor názvů, který se má zahrnout.
Reference
a Using
prvky jsou nezávislé na jazyce. Vložené úlohy lze psát v některém z podporovaných jazyků .NET CodeDom, například v jazyce Visual Basic nebo Visual C#.
Poznámka:
Prvky obsažené v elementu Task
jsou specifické pro objekt pro vytváření úloh, v tomto případě objekt pro vytváření úloh kódu.
Prvek kódu
Posledním podřízeným prvkem, který se má objevit uvnitř elementu Task
Code
, je element. Prvek Code
obsahuje nebo vyhledá kód, který chcete zkompilovat do úkolu. To, co vložíte do elementu Code
, závisí na tom, jak chcete napsat úkol.
Atribut Language
určuje jazyk, ve kterém je váš kód napsán. Přijatelné hodnoty jsou cs
pro jazyk C# vb
pro Visual Basic.
Atribut Type
určuje typ kódu, který se nachází v elementu Code
.
Pokud je
Class
hodnotaType
, pakCode
prvek obsahuje kód pro třídu, která je odvozena z ITask rozhraní.Pokud je
Method
hodnotaType
, pak kód definuje přepsáníExecute
metody ITask rozhraní.Pokud je
Fragment
hodnotaType
, pak kód definuje obsahExecute
metody, ale ne podpis neboreturn
příkaz.
Samotný kód se obvykle zobrazuje mezi značkou <![CDATA[
a značkou ]]>
. Protože kód je v části CDATA, nemusíte se starat o únik vyhrazených znaků, například "<" nebo ">".
Případně můžete pomocí Source
atributu Code
elementu určit umístění souboru, který obsahuje kód pro váš úkol. Kód ve zdrojovém souboru musí být typu, který je určen atributem Type
. Source
Pokud atribut existuje, výchozí hodnota Type
je Class
. Pokud Source
není k dispozici, výchozí hodnota je Fragment
.
Poznámka:
Při definování třídy úkolu ve zdrojovém souboru musí název třídy souhlasit s TaskName
atributem odpovídajícího UsingTask elementu.
Helloworld
Tady je robustnější vložený úkol. Úloha HelloWorld zobrazí "Hello, world!" na výchozím zařízení protokolování chyb, což je obvykle systémová konzola nebo okno Výstup sady Visual Studio. Prvek Reference
v příkladu je zahrnut pouze pro ilustraci.
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task displays "Hello, world!" -->
<UsingTask
TaskName="HelloWorld"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup />
<Task>
<Reference Include="System.Xml"/>
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
// Display "Hello, world!"
Log.LogError("Hello, world!");
]]>
</Code>
</Task>
</UsingTask>
</Project>
Úkol HelloWorld můžete uložit do souboru s názvem HelloWorld.targets a pak ho vyvolat z projektu následujícím způsobem.
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="HelloWorld.targets" />
<Target Name="Hello">
<HelloWorld />
</Target>
</Project>
Vstupní a výstupní parametry
Vložené parametry úkolu jsou podřízené prvky elementu ParameterGroup
. Každý parametr přebírá název prvku, který ho definuje. Následující kód definuje parametr Text
.
<ParameterGroup>
<Text />
</ParameterGroup>
Parametry můžou mít jeden nebo více těchto atributů:
Required
je volitelný atribut, který jefalse
ve výchozím nastavení. Pokudtrue
je parametr povinný a musí být před voláním úkolu uvedena hodnota.ParameterType
je volitelný atribut, který jeSystem.String
ve výchozím nastavení. Může být nastaven na libovolný plně kvalifikovaný typ, který je buď položka nebo hodnota, která lze převést na řetězec pomocí System.Convert.ChangeType. (Jinými slovy, jakýkoli typ, který lze předat externímu úkolu a z externího úkolu.)Output
je volitelný atribut, který jefalse
ve výchozím nastavení. Pokudtrue
, pak parametr musí být před vrácením z Execute metoda.
Příklad:
<ParameterGroup>
<Expression Required="true" />
<Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<Tally ParameterType="System.Int32" Output="true" />
</ParameterGroup>
definuje tyto tři parametry:
Expression
je povinný vstupní parametr typu System.String.Files
je povinný vstupní parametr seznamu položek.Tally
je výstupní parametr typu System.Int32.
Pokud prvek Code
má Type
atribut Fragment
nebo Method
, vlastnosti jsou automaticky vytvořeny pro každý parametr. V opačném případě musí být vlastnosti explicitně deklarovány ve zdrojovém kódu úlohy a musí přesně odpovídat jejich definici parametrů.
Příklad
Následující vložená úloha nahradí každý výskyt tokenu v daném souboru danou hodnotou.
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="15.0">
<UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
<Path ParameterType="System.String" Required="true" />
<Token ParameterType="System.String" Required="true" />
<Replacement ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs"><![CDATA[
string content = File.ReadAllText(Path);
content = content.Replace(Token, Replacement);
File.WriteAllText(Path, content);
]]></Code>
</Task>
</UsingTask>
<Target Name='Demo' >
<TokenReplace Path="C:\Project\Target.config" Token="$MyToken$" Replacement="MyValue"/>
</Target>
</Project>