Пошаговое руководство. Создание встроенной задачиWalkthrough: Create an inline task

Задачи MSBuild обычно создаются путем компиляции класса, реализующего интерфейс ITask.MSBuild tasks are typically created by compiling a class that implements the ITask interface. Начиная с .NET Framework 4, в файле проекта можно создавать встроенные задачи.Starting with the .NET Framework version 4, you can create tasks inline in the project file. Для размещения задачи не нужно создавать отдельную сборку.You do not have to create a separate assembly to host the task. См. дополнительные сведения о встроенных задачах.For more information, see Inline tasks.

В этом пошаговом руководстве показано, как создать и выполнить следующие встроенные задачи:This walkthrough shows how to create and run these inline tasks:

  • задача, которая не имеет входных или выходных параметров;A task that has no input or output parameters.

  • задача, которая имеет один входной параметр и не имеет выходных параметров;A task that has one input parameter and no output parameters.

  • задача с двумя входными параметрами и одним выходным параметром, возвращающим свойство MSBuild;A task that has two input parameters, and one output parameter that returns an MSBuild property.

  • задача с двумя входными параметрами и одним выходным параметром, возвращающим элемент MSBuild.A task that has two input parameters, and one output parameter that returns an MSBuild item.

Чтобы создать и выполнить задачи, следует использовать Visual Studio и окно командной строки Visual Studio, как показано ниже.To create and run the tasks, use Visual Studio and the Visual Studio Command Prompt Window, as follows:

  1. Создайте файл проекта MSBuild с помощью Visual Studio.Create an MSBuild project file by using Visual Studio.

  2. Измените файл проекта в Visual Studio, чтобы создать встроенную задачу.Modify the project file in Visual Studio to create the inline task.

  3. Используйте окно командной строки, чтобы выполнить построение проекта и проверить результаты.Use the Command Prompt Window to build the project and examine the results.

Создание и изменение проекта MSBuildCreate and modify an MSBuild project

Система проектов Visual Studio основана на MSBuild.The Visual Studio project system is based on MSBuild. Поэтому вы можете создать файл проекта построения с помощью Visual Studio.Therefore, you can create a build project file by using Visual Studio. В этом разделе создается файл проекта Visual C#.In this section, you create a Visual C# project file. (Вместо него можно создать файл проекта Visual Basic.(You can create a Visual Basic project file instead. В контексте данного руководства различия между двумя файлами проекта незначительны.)In the context of this tutorial, the difference between the two project files is minor.)

Создание и изменение файла проектаTo create and modify a project file

  1. В Visual Studio создайте новый проект с помощью шаблона приложения C# Windows Forms.In Visual Studio, create a new project using the C# Windows Forms Application template. В поле Имя файла введите InlineTasks.In the Name box, type InlineTasks. Укажите расположение для решения, например D:\ .Type a Location for the solution, for example, D:\. Выберите Создать каталог для решения, снимите флажок Добавить в систему управления версиями, а для параметра Имя решения укажите InlineTasks.Ensure that Create directory for solution is selected, Add to Source Control is cleared, and Solution Name is InlineTasks.

  2. Нажмите кнопку ОК, чтобы создать файл проекта.Click OK to create the project file.

  3. В обозревателе решений щелкните правой кнопкой мыши узел проекта InlineTasks и выберите команду Выгрузить проект.In Solution Explorer, right-click the InlineTasks project node, and then click Unload Project.

  4. Еще раз щелкните правой кнопкой мыши узел проекта, а затем выберите Изменить InlineTasks.csproj.Right-click the project node again, and then click Edit InlineTasks.csproj.

    Файл проекта откроется в редакторе кода.The project file appears in the code editor.

Добавление простой задачи HelloAdd a basic Hello task

Теперь добавьте в файл проекта простую задачу, отображающую сообщение "Hello, world!".Now, add to the project file a basic task that displays the message "Hello, world!" Также добавьте целевой объект по умолчанию, TestBuild, который будет вызывать задачу.Also add a default TestBuild target to invoke the task.

Добавление простой задачи HelloTo add a basic Hello task

  1. В корневом узле Project измените атрибут DefaultTargets на TestBuild. Итоговый узел Project должен выглядеть следующим образом:In the root Project node, change the DefaultTargets attribute to TestBuild.The resulting Project node should resemble this example:

    <Project ToolsVersion="4.0" DefaultTargets="TestBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
  2. Добавьте следующую встроенную задачу и целевой объект в файл проекта непосредственно перед тегом </Project>.Add the following inline task and target to the project file just before the </Project> tag.

    <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. Сохраните файл проекта.Save the project file.

    Этот код создает встроенную задачу с именем Hello и не содержит параметров, ссылок или директив Using.This code creates an inline task that is named Hello and has no parameters, references, or Using directives. Задача Hello содержит только одну строку кода, которая отображает сообщение hello в устройстве ведения журнала по умолчанию, обычно в окне консоли.The Hello task contains just one line of code, which displays a hello message on the default logging device, typically the console window.

Выполнение задачи HelloRun the Hello task

Запустите MSBuild в окне командной строки, чтобы создать задачу Hello и обработать вызывающий ее целевой объект TestBuild.Run MSBuild by using the Command Prompt Window to construct the Hello task and to process the TestBuild target that invokes it.

Выполнение задачи HelloTo run the Hello task
  1. Щелкните Запустить, Все программы, найдите папку Инструменты Visual Studio и щелкните Командная строка Visual Studio.Click Start, click All Programs, and then locate the Visual Studio Tools folder and click Visual Studio Command Prompt.

  2. В окне командной строки найдите папку, содержащую файл проекта. В нашем примере это D:\InlineTasks\InlineTasks\ .In the Command Prompt Window, locate the folder that contains the project file, in this case, D:\InlineTasks\InlineTasks\.

  3. Введите msbuild без параметров команды и нажмите клавишу ВВОД.Type msbuild without command switches, and then press Enter. По умолчанию в результате создается файл InlineTasks.csproj и выполняется обработка стандартного целевого объекта TestBuild, вызывающего задачу Hello.By default, this builds the InlineTasks.csproj file and processes the default target TestBuild, which invokes the Hello task.

  4. Изучите выходные данные в окне командной строки.Examine the output in the Command Prompt Window. Вы должны увидеть следующую строку:You should see this line:

    Hello, world!

    Примечание

    Если вы не видите сообщение hello, повторно сохраните файл проекта и выполните задачу Hello.If you do not see the hello message, try saving the project file again and then run the Hello task.

    Переключаясь между редактором кода и окном командной строки, можно изменять файл проекта и сразу же видеть результаты.By alternating between the code editor and the Command Prompt Window, you can change the project file and quickly see the results.

Определение задачи EchoDefine the Echo task

Создайте встроенную задачу, которая принимает строковый параметр и отображает строку в устройстве ведения журнала по умолчанию.Create an inline task that accepts a string parameter and displays the string on the default logging device.

Определение задачи EchoTo define the Echo task

  1. В редакторе кода замените задачу Hello и целевой объект TestBuild, используя следующий код.In the code editor, replace the Hello task and TestBuild target by using the following code.

    <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. В окне командной строки введите msbuild без параметров команды и нажмите клавишу ВВОД.In the Command Prompt Window, type msbuild without command switches, and then press Enter. По умолчанию в результате обрабатывается стандартный целевой объект TestBuild, вызывающий задачу Echo.By default, this processes the default target TestBuild, which invokes the Echo task.

  3. Изучите выходные данные в окне командной строки.Examine the output in the Command Prompt Window. Вы должны увидеть следующую строку:You should see this line:

    Greetings!

    Этот код определяет встроенную задачу с именем Echo и содержит только один необходимый входной параметр Text.This code defines an inline task that is named Echo and has just one required input parameter Text. По умолчанию параметры имеют тип System.String.By default, parameters are of type System.String. Значение параметра Text задается, когда целевой объект TestBuild вызывает задачу Echo.The value of the Text parameter is set when the TestBuild target invokes the Echo task.

Определение задачи AdderDefine the Adder task

Создайте встроенную задачу, которая добавляет два целочисленных параметра и выдает их сумму в виде свойства MSBuild.Create an inline task that adds two integer parameters and emits their sum as an MSBuild property.

Определение задачи AdderTo define the Adder task

  1. В редакторе кода замените задачу Echo и целевой объект TestBuild, используя следующий код.In the code editor, replace the Echo task and TestBuild target by using the following code.

    <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. В окне командной строки введите msbuild без параметров команды и нажмите клавишу ВВОД.In the Command Prompt Window, type msbuild without command switches, and then press Enter. По умолчанию в результате обрабатывается стандартный целевой объект TestBuild, вызывающий задачу Echo.By default, this processes the default target TestBuild, which invokes the Echo task.

  3. Изучите выходные данные в окне командной строки.Examine the output in the Command Prompt Window. Вы должны увидеть следующую строку:You should see this line:

    The sum is 9

    Этот код определяет встроенную задачу с именем Adder и содержит два обязательных целочисленных входных параметра, A и B, и один целочисленный выходной параметр C. Задача Adder добавляет два входных параметра и возвращает их сумму в выходном параметре.This code defines an inline task that is named Adder and has two required integer input parameters, A and B, and one integer output parameter, C. The Adder task adds the two input parameters and returns the sum in the output parameter. Сумма выдается в виде свойства MSBuild Sum.The sum is emitted as the MSBuild property Sum. Значения входных параметров задаются, когда целевой объект TestBuild вызывает задачу Adder.The values of the input parameters are set when the TestBuild target invokes the Adder task.

Определение задачи RegXDefine the RegX task

Создайте встроенную задачу, которая принимает группу элементов и регулярное выражение и возвращает список всех элементов, содержимое файлов которых соответствует выражению.Create an inline task that accepts an item group and a regular expression, and returns a list of all items that have file content that matches the expression.

Определение задачи RegXTo define the RegX task

  1. В редакторе кода замените задачу Adder и целевой объект TestBuild, используя следующий код.In the code editor, replace the Adder task and TestBuild target by using the following code.

    <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. В окне командной строки введите msbuild без параметров команды и нажмите клавишу ВВОД.In the Command Prompt Window, type msbuild without command switches, and then press Enter. По умолчанию в результате обрабатывается стандартный целевой объект TestBuild, вызывающий задачу RegX.By default, this processes the default target TestBuild, which invokes the RegX task.

  3. Изучите выходные данные в окне командной строки.Examine the output in the Command Prompt Window. Должны отобразиться следующие строки:You should see these lines:

    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
    

    Этот код определяет встроенную задачу с именем RegX и содержит следующие три параметра:This code defines an inline task that is named RegX and has these three parameters:

  • Expression — обязательный строковый входной параметр, где в качестве значения принимается регулярное выражение для сопоставления.Expression is a required string input parameter that has a value that is the regular expression to be matched. В этом примере выражение соответствует словам public или protected.In this example, the expression matches the words "public" or "protected".

  • Files — обязательный строковый входной параметр списка элементов, где в качестве значения принимается список файлов для поиска соответствия.Files is a required item list input parameter that has a value that is a list of files to be searched for the match. В этом примере для параметра Files задан элемент Compile, который выводит список исходных файлов проекта.In this example, Files is set to the Compile item, which lists the project source files.

  • Result — обязательный выходной параметр, где в качестве значения принимается список файлов, в которых есть содержимое, соответствующее регулярному выражению.Result is an output parameter that has a value that is the list of files that have contents that match the regular expression.

    Значения входных параметров задаются, когда целевой объект TestBuild вызывает задачу RegX.The value of the input parameters are set when the TestBuild target invokes the RegX task. Задача RegX считывает каждый файл и возвращает список файлов, соответствующих регулярному выражению.The RegX task reads every file and returns the list of files that match the regular expression. Этот список возвращается в виде выходного параметра Result, который выдается как элемент MSBuild MatchedFiles.This list is returned as the Result output parameter, which is emitted as the MSBuild item MatchedFiles.

Использование зарезервированных знаковHandle reserved characters

Средство синтаксического анализа MSBuild обрабатывает встроенные задачи как XML-файлы.The MSBuild parser processes inline tasks as XML. Знаки с зарезервированным значением в XML, например <" and ">, обнаруживаются и обрабатываются, как если бы они были в формате XML, а не в формате исходного кода .NET.Characters that have reserved meaning in XML, for example, "<" and ">", are detected and handled as if they were XML, and not .NET source code. Чтобы включать зарезервированные знаки в выражениях кода, таких как Files.Length > 0, напишите элемент Code, чтобы его содержимое было включено в выражение CDATA, следующим образом:To include the reserved characters in code expressions such as Files.Length > 0, write the Code element so that its contents are contained in a CDATA expression, as follows:

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

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

См. такжеSee also