Zadania wbudowane programu MSBuild
Program MSBuild zadań są zwykle tworzone przez skompilowanie klasy, która implementuje ITask interfejsu.Aby uzyskać więcej informacji, zobacz Zadania programu MSBuild.
Począwszy od.NET Framework w wersji 4, można utworzyć wbudowane zadania w pliku projektu.Nie masz tworzenie oddzielnych zestawów do obsługi zadania.Dzięki temu łatwiejsze do śledzenia kodu źródłowego i łatwiejsze do wdrożenia zadania.Kod źródłowy jest zintegrowany w skrypcie.
Struktura zadania Inline
To zadanie wbudowany jest zawarty w UsingTask element.Wbudowane zadania i UsingTask element, który go zawiera zazwyczaj są zawarte w pliku .targets i importowane do innych plików projektów, zgodnie z wymaganiami.Oto zadanie podstawowe wbudowanej.Należy zauważyć, że nic nie robi.
<Project ToolsVersion="12.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task does nothing. -->
<UsingTask
TaskName="DoNothing"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll" >
<ParameterGroup />
<Task>
<Reference Include="" />
<Using Namespace="" />
<Code Type="Fragment" Language="cs">
</Code>
</Task>
</UsingTask>
</Project>
UsingTask Element w przykładzie ma trzy atrybuty, które opisują zadania i wbudowany fabryki zadania, który kompiluje.
TaskName Atrybut nazwy zadania, w tym przypadku, DoNothing.
TaskFactory Atrybut nazwy klasy, która implementuje inline factory zadania.
AssemblyFile Atrybut podaje lokalizację inline factory zadania.Alternatywnie, można użyć AssemblyName atrybut do określania w pełni kwalifikowanej nazwy klasy fabryki zadania inline, która zazwyczaj znajduje się w globalna pamięć podręczna zestawów (GAC).
Pozostałe elementy DoNothing zadań są puste, są dostarczane do zilustrowania porządek i struktura zadania wbudowanej.Bardziej wydajny przykład został przedstawiony w dalszej części tego tematu.
ParameterGroup Element jest opcjonalne.Po określeniu deklaruje parametrów zadania.Aby uzyskać więcej informacji na temat parametrów wejściowych i wyjściowych zobacz "Wejściowe i parametry wyjściowe" w dalszej części tego tematu.
Task Element zawiera opis i zawiera kod źródłowy zadania.
Reference Element określa odwołania do zestawów .NET, które są używane w kodzie.Jest to równoważne dodając odwołanie do projektu w programie Visual Studio.Include Atrybutu określa ścieżkę odnośny zestaw.
Using Element zawiera listę nazw, do którego chcesz uzyskać dostęp.Przypomina to Using instrukcji języka Visual C#.Namespace Atrybutu określa obszar nazw, aby uwzględnić.
Referencei Using elementy są niezależne od języka.Wbudowane zadania można zapisać w dowolnym z obsługiwanych języków .NET CodeDom, na przykład języka Visual Basic lub Visual C#.
[!UWAGA]
Elementy zawarte przez Task elementu są specyficzne dla fabryki zadań, w tym przypadku kod fabryki zadania.
Element kodu
Ostatni element podrzędny pojawił się w Task jest element Code element.Code Zawiera element lub lokalizuje kod, który ma być tworzone w zadanie.Umieścić w Code element zależy od tego, w jaki sposób chcesz zapisać zadanie.
Language Atrybut określa język, w którym jest napisany kod.Dozwolone wartości to cs dla C# vb dla języka Visual Basic.
Type Atrybut określa typ kodu, który znajduje się w Code element.
Jeśli wartość Type jest klasy, a następnie Code element zawiera kod klasy, która wynika z ITask interfejsu.
Jeśli wartość Type jest Metoda, a następnie kod definiuje nadpisanie Execute metody ITask interfejsu.
Jeśli wartość Type jest Fragment, a następnie kod definiuje zawartość Execute metoda, ale nie podpisu lub return instrukcji.
Sam kod pojawia się zwykle między <![CDATA[ znacznik i ]]> znacznika.Ponieważ kod znajduje się w sekcji CDATA, nie musisz się martwić o ucieczce zastrzeżone znaki, na przykład "<"lub">".
Alternatywnie, można użyć Source atrybut Code element, aby określić lokalizację pliku, który zawiera kod dla danego zadania.Kod w pliku źródłowym musi być typu, który jest określony przez Type atrybut.Jeśli Source atrybut jest obecny, wartością domyślną Type jest klasy.Jeśli Source jest nieobecny, wartością domyślną jest Fragment.
[!UWAGA]
Przy definiowaniu tej klasy zadania w pliku źródłowym, nazwa klasy musi uzgodnić z TaskName atrybut odpowiadającego UsingTask element.
Witaj świecie
W tym miejscu jest zadaniem inline bardziej niezawodne.Wyświetla zadania HelloWorld "Witaj, świecie!" na urządzenie domyślne rejestrowanie błędów, który zazwyczaj jest konsola systemowa lub Visual Studio produkcji okna.Reference Element w przykładzie jest uwzględniane tylko do celów informacyjnych.
<Project ToolsVersion="12.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- This simple inline task displays "Hello, world!" -->
<UsingTask
TaskName="HelloWorld"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup />
<Task>
<Reference Include="System.Xml.dll"/>
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
// Display "Hello, world!"
Log.LogError("Hello, world!");
]]>
</Code>
</Task>
</UsingTask>
</Project>
Można zapisać zadanie HelloWorld w pliku o nazwie HelloWorld.targets, a następnie wywołać ją z projektu w następujący sposób.
<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="HelloWorld.targets" />
<Target Name="Hello">
<HelloWorld />
</Target>
</Project>
Dane wejściowe i parametry wyjściowe
Parametry zadania wbudowane są elementami podrzędnymi ParameterGroup element.Każdy parametr ma nazwę elementu, który definiuje ją.W poniższym kodzie zdefiniowano parametr Text.
<ParameterGroup>
<Text />
</ParameterGroup>
Parametry mogą mieć jedną lub więcej z tych atrybutów:
Requiredjest opcjonalny atrybut, który jest false domyślnie.Jeśli true, a następnie parametr jest wymagana i musi być danej wartości przed wywołaniem zadania.
ParameterTypejest opcjonalny atrybut, który jest System.String domyślnie.Może on być ustawiony na dowolny typ pełni kwalifikowana, czyli element lub wartości, które mogą być konwertowane do i z ciągu znaków przy użyciu System.Convert.ChangeType. (Innymi słowy, wszelkiego rodzaju, mogą być przekazywane do i z zadanie zewnętrzne.)
Outputjest opcjonalny atrybut, który jest false domyślnie.Jeśli true, a następnie parametr musi być danej wartości przed powrotem z Execute Metoda.
Na przykład:
<ParameterGroup>
<Expression Required="true" />
<Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<Tally ParameterType="System.Int32" Output="true" />
</ParameterGroup>
definiuje te trzy parametry:
Expressionjest wymagany parametr wejściowy typu System.String.
Filesto parametr wejściowy listy wymaganego elementu.
Tallyjest parametrem wyjściowym typu System.Int32.
Jeśli Code element ma Type atrybut Fragment lub Metoda, a następnie właściwości są tworzone automatycznie dla każdego parametru.W przeciwnym razie właściwości musi być jawnie zadeklarowane w kodzie źródłowym zadań i musi dokładnie odpowiadać ich definicji parametrów.
Przykład
Następujące zadanie inline zamienia każde wystąpienie tokenu w danym pliku podana wartość.
<Project xmlns='https://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="12.0">
<UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.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>
Zobacz też
Zadania
Wskazówki: tworzenie zadania wbudowanego