Vytvoření vložené úlohy

Úlohy NÁSTROJE MSBuild jsou obvykle vytvořeny kompilací třídy, která implementuje ITask rozhraní. 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í. Další informace najdete v tématu Vložené úkoly.

Tento názorný postup ukazuje, jak vytvořit a spustit tyto vložené úlohy:

  • Úkol, který nemá žádné vstupní nebo výstupní parametry.

  • Úkol, který má jeden vstupní parametr a žádné výstupní parametry.

  • Úloha se dvěma vstupními parametry a jedním výstupním parametrem, který vrací vlastnost MSBuild.

  • Úloha se dvěma vstupními parametry a jedním výstupním parametrem, který vrací položku MSBuild.

Pokud chcete vytvářet a spouštět úlohy, použijte Visual Studio a okno příkazového řádku sady Visual Studio následujícím způsobem:

  1. Pomocí sady Visual Studio vytvořte soubor projektu MSBuild.

  2. Upravte soubor projektu v sadě Visual Studio a vytvořte vložený úkol.

  3. Pomocí okna příkazového řádku sestavte projekt a prohlédněte si výsledky.

Vytvoření a úprava projektu MSBuild

Systém projektů sady Visual Studio je založený na nástroji MSBuild. Proto můžete vytvořit soubor projektu sestavení pomocí sady Visual Studio. V této části vytvoříte soubor projektu Visual C#. (Místo toho můžete vytvořit soubor projektu jazyka Visual Basic. V kontextu tohoto kurzu je rozdíl mezi dvěma soubory projektu menší.)

Vytvoření a úprava souboru projektu

  1. V sadě Visual Studio vytvořte nový projekt pomocí šablony aplikace model Windows Forms C#. Do pole Název zadejte InlineTasks. Zadejte umístění řešení, například D:\. Ujistěte se, že je vybrána možnost Vytvořit adresář pro řešení , zrušte zaškrtnutí políčka Přidat do správy zdrojového kódu a název řešení je InlineTasks.

  2. Kliknutím na tlačítko OK vytvořte soubor projektu.

  3. V Průzkumník řešení klepněte pravým tlačítkem myši na uzel projektu InlineTasks a potom klepněte na tlačítko Uvolnit projekt.

  4. Znovu klikněte pravým tlačítkem myši na uzel projektu a potom klepněte na příkaz Upravit InlineTasks.csproj.

    Soubor projektu se zobrazí v editoru kódu.

Přidání základního úkolu Hello

Teď přidejte do souboru projektu základní úkol, který zobrazí zprávu "Hello, world!" Přidejte také výchozí cíl TestBuildu pro vyvolání úlohy.

Přidání základního úkolu Hello

  1. V kořenovém Project uzlu změňte DefaultTargets atribut na TestBuild. Výsledný Project uzel by měl vypadat podobně jako v tomto příkladu:

    <Project ToolsVersion="4.0" DefaultTargets="TestBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
  2. Přidejte následující vložený úkol a cíl do souboru projektu těsně před </Project> značku.

    <UsingTask TaskName="Hello" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup />
      <Task>
        <Code Type="Fragment" Language="cs">
          Log.LogMessage(MessageImportance.High, "Hello, world!");
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <Hello />
    </Target>
    
  3. Uložte soubor projektu.

    Tento kód vytvoří vloženou úlohu s názvem Hello a nemá žádné parametry, odkazy nebo Using direktivy. Úloha Hello obsahuje jenom jeden řádek kódu, který zobrazuje zprávu hello na výchozím zařízení protokolování, obvykle v okně konzoly.

Spuštění úlohy Hello

Spusťte nástroj MSBuild pomocí okna příkazového řádku k vytvoření úlohy Hello a zpracování cíle TestBuild, který ho vyvolá.

Spuštění úlohy Hello
  1. Klepněte na tlačítko Start, klepněte na tlačítko Všechny programy a potom vyhledejte složku Visual Studio Tools a klepněte na příkazový řádek sady Visual Studio.

  2. V okně příkazového řádku vyhledejte složku, která obsahuje soubor projektu, v tomto případě D:\InlineTasks\InlineTasks\.

  3. Zadejte příkaz msbuild bez přepínačů příkazů a stiskněte Enter. Ve výchozím nastavení se sestaví soubor InlineTasks.csproj a zpracuje výchozí cílový testBuild, který vyvolá úlohu Hello.

  4. Prohlédněte si výstup v okně příkazového řádku. Měl by se zobrazit tento řádek:

    Hello, world!

    Poznámka:

    Pokud zprávu hello nevidíte, zkuste soubor projektu uložit znovu a pak spusťte úlohu Hello.

    Střídavým přepínáním mezi editorem kódu a oknem příkazového řádku můžete změnit soubor projektu a rychle zobrazit výsledky.

Definování úkolu Echo

Vytvořte vloženou úlohu, která přijímá parametr řetězce a zobrazí řetězec na výchozím zařízení protokolování.

Definování úkolu Echo

  1. V editoru kódu nahraďte úlohu Hello a cíl TestBuildu následujícím kódem.

    <UsingTask TaskName="Echo" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <Text Required="true" />
      </ParameterGroup>
      <Task>
        <Code Type="Fragment" Language="cs">
          Log.LogMessage(MessageImportance.High, Text);
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <Echo Text="Greetings!" />
    </Target>
    
  2. V okně příkazového řádku zadejte msbuild bez přepínačů příkazů a stiskněte Enter. Ve výchozím nastavení tento proces zpracuje výchozí cílový testBuild, který vyvolá úlohu Echo.

  3. Prohlédněte si výstup v okně příkazového řádku. Měl by se zobrazit tento řádek:

    Greetings!

    Tento kód definuje vloženou úlohu s názvem Echo a má pouze jeden povinný vstupní parametr Text. Ve výchozím nastavení jsou parametry typu System.String. Hodnota parametru Text je nastavena, když cíl TestBuild vyvolá úlohu Echo.

Definování úlohy Adder

Vytvořte vloženou úlohu, která přidá dva celočíselné parametry a vygeneruje jejich součet jako vlastnost MSBuild.

Definování úlohy Adder

  1. V editoru kódu nahraďte úlohu Echo a cíl TestBuild pomocí následujícího kódu.

    <UsingTask TaskName="Adder" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <A ParameterType="System.Int32" Required="true" />
        <B ParameterType="System.Int32" Required="true" />
        <C ParameterType="System.Int32" Output="true" />
      </ParameterGroup>
      <Task>
        <Code Type="Fragment" Language="cs">
          C = A + B;
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <Adder A="4" B="5">
        <Output PropertyName="Sum" TaskParameter="C" />
      </Adder>
      <Message Text="The sum is $(Sum)" Importance="High" />
    </Target>
    
  2. V okně příkazového řádku zadejte msbuild bez přepínačů příkazů a stiskněte Enter. Ve výchozím nastavení tento proces zpracuje výchozí cílový testBuild, který vyvolá úlohu Echo.

  3. Prohlédněte si výstup v okně příkazového řádku. Měl by se zobrazit tento řádek:

    The sum is 9

    Tento kód definuje vloženou úlohu s názvem Adder a má dva požadované celočíselné vstupní parametry, A a B a jeden celočíselnou výstupní parametr C. Úloha Adder přidá dva vstupní parametry a vrátí součet ve výstupním parametru. Součet se vygeneruje jako vlastnost SumMSBuild . Hodnoty vstupních parametrů se nastaví, když cíl TestBuild vyvolá úlohu Adder.

Definování úlohy RegX

Vytvořte vložený úkol, který přijímá skupinu položek a regulární výraz, a vrátí seznam všech položek, které mají obsah souboru, který odpovídá výrazu.

Definování úlohy RegX

  1. V editoru kódu nahraďte úlohu Adder a cíl TestBuildu následujícím kódem.

    <UsingTask TaskName="RegX" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
      <ParameterGroup>
        <Expression Required="true" />
        <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
      </ParameterGroup>
      <Task>
        <Using Namespace="System.Text.RegularExpressions"/>
        <Code Type="Fragment" Language="cs">
    <![CDATA[
          if (Files.Length > 0)
          {
            Result = new TaskItem[Files.Length];
            for (int i = 0; i < Files.Length; i++)
            {
              ITaskItem item = Files[i];
              string path = item.GetMetadata("FullPath");
              using(StreamReader rdr = File.OpenText(path))
              {
                if (Regex.Match(rdr.ReadToEnd(), Expression).Success)
                {
                  Result[i] = new TaskItem(item.ItemSpec);
                }
              }
            }
          }
    ]]>
        </Code>
      </Task>
    </UsingTask>
    <Target Name="TestBuild">
      <RegX Expression="public|protected" Files="@(Compile)">
        <Output ItemName="MatchedFiles" TaskParameter="Result" />
      </RegX>
      <Message Text="Input files: @(Compile)" Importance="High" />
      <Message Text="Matched files: @(MatchedFiles)" Importance="High" />
    </Target>
    
  2. V okně příkazového řádku zadejte msbuild bez přepínačů příkazů a stiskněte Enter. Ve výchozím nastavení tento proces zpracuje výchozí cílový testBuild, který vyvolá úlohu RegX.

  3. Prohlédněte si výstup v okně příkazového řádku. Měly by se zobrazit tyto řádky:

    Input files: Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs
    
    Matched files: Form1.cs;Form1.Designer.cs;Properties\Settings.Designer.cs
    

    Tento kód definuje vloženou úlohu s názvem RegX a má tyto tři parametry:

  • Expression je povinný vstupní parametr řetězce, který má hodnotu, která se má shodovat s regulárním výrazem. V tomto příkladu výraz odpovídá slovu "public" nebo "protected".

  • Files je povinný vstupní parametr seznamu položek, který má hodnotu, která je seznamem souborů, které se mají vyhledat. V tomto příkladu je nastavena položkaCompile, Files která obsahuje seznam zdrojových souborů projektu.

  • Result je výstupní parametr, který má hodnotu, která je seznamem souborů, které mají obsah odpovídající regulárnímu výrazu.

    Hodnota vstupních parametrů se nastaví, když cíl TestBuild vyvolá úlohu RegX. Úloha RegX přečte každý soubor a vrátí seznam souborů, které odpovídají regulárnímu výrazu. Tento seznam je vrácen jako Result výstupní parametr, který je generován jako položka MatchedFilesMSBuild .

Zpracování vyhrazených znaků

Analyzátor MSBuild zpracovává vložené úlohy jako XML. Znaky, které mají vyhrazený význam v JAZYCE XML, například "<" a ">", jsou zjištěny a zpracovány, jako by byly XML, a ne zdrojový kód .NET. Pokud chcete zahrnout rezervované znaky do výrazů kódu, jako Files.Length > 0je například , napište Code prvek tak, aby jeho obsah byl obsažen ve výrazu CDATA následujícím způsobem:

<Code Type="Fragment" Language="cs">
 <![CDATA[

 if (Files.Length > 0)
 {
     // Your code goes here.
 }
 ]]>
</Code>