Udostępnij za pośrednictwem


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

Koncepcje

Zadania programu MSBuild