Поделиться через


Написание задач

В задачах предоставляется код, выполняющийся во время процесса построения. Задания содержатся в целях. В MSBuild включена библиотека типичных задач, а также можно создавать собственные задачи. Дополнительные сведения о библиотеке задач, включенных в MSBuild, см. в разделе Справочные сведения о задачах MSBuild.

Задачи

Примеры задач: Copy — копирование одного или нескольких файлов, MakeDir — создание каталога, Csc — компиляция файлов исходного кода Visual C#. Каждая задача реализована в виде класса платформы .NET, обеспечивающего интерфейс ITask, который определен в сборке Microsoft.Build.Framework.dll.

Существуют два подхода к реализации задачи.

  • Реализация непосредственно интерфейса ITask.

  • Получение класса из вспомогательного класса Task, который определен в сборке Microsoft.Build.Utilities.dll. Задача реализует ITask и обеспечивает реализации по умолчанию некоторых элементов ITask. Кроме того, упрощается ведение журнала.

В обоих случаях необходимо добавить в свой класс метод с названием Execute, то есть метод, который вызывается при выполнении задачи. Этот метод не получает никаких параметров и возвращает значение Boolean: true, если задача успешно выполнена, или false, если задачу выполнить не удалось. В следующем примере показана задача, не выполняющая никакого действия и возвращающая значение true.

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            return true;
        }
    }
}

Эта задача запускается из следующего файла проекта:

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <SimpleTask />
    </Target>
</Project>

Если свойства .NET создаются в классе задач, то выполняющиеся задачи могут получать входные данные из файла проекта. MSBuild задает эти свойства непосредственно перед вызовом метода Execute. Чтобы создать свойство строки, используйте код задачи следующего вида:

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace MyTasks
{
    public class SimpleTask : Task
    {
        public override bool Execute()
        {
            return true;
         }

        private string myProperty;
        public string MyProperty
        {
            get { return myProperty; }
            set { myProperty = value; }
        }
    }
}

Из следующего файла проекта запускается эта задача и задается свойство MyProperty для заданного значения:

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
   <Target Name="MyTarget">
      <SimpleTask MyProperty="Value for MyProperty" />
   </Target>
</Project>

Регистрация задач

Если проекту предстоит запускать задачу, MSBuild необходимо знать, как найти сборку, содержащую класс задачи. Задачи регистрируются с использованием метода Элемент UsingTask (MSBuild).

Файл Microsoft.Common.Tasks в MSBuild — это файл проекта, который содержит список элементов UsingTask, регистрирующих все задачи, предоставленные вместе с MSBuild. Этот файл включается автоматически при создании каждого проекта. Если задача, зарегистрированная в файле Microsoft.Common.Tasks, зарегистрирована также в текущем файле проекта, текущий файл проекта имеет преимущество; таким образом можно переопределить задачу по умолчанию собственной задачей с тем же именем.

Совет

Чтобы увидеть список задач, предоставленных вместе с MSBuild, просмотрите содержимое файла Microsoft.Common.Tasks.

Создание событий из задачи

В случае получения задачи из вспомогательного класса Task можно использовать любой из следующих вспомогательных методов в классе Task для создания событий, которые будут подхватываться и отображаться каким-либо зарегистрированным средством ведения журнала:

public override bool Execute()
{
    Log.LogError("messageResource1", "1", "2", "3");
    Log.LogWarning("messageResource2");
    Log.LogMessage(MessageImportance.High, "messageResource3");
    ...
}

Если в задаче реализуется непосредственно интерфейс ITask, можно также создавать эти события, но необходимо использовать интерфейс IBuildEngine. В следующем примере показана задача, реализующая ITask и создающая пользовательское событие:

public class SimpleTask : ITask
{
    private IBuildEngine buildEngine;
    public IBuildEngine BuildEngine
    {
        get{ return buildEngine; }
        set{ buildEngine = value; }
    }

    public override bool Execute()
    {
        TaskEventArgs taskEvent =
            new TaskEventArgs(BuildEventCategory.Custom,
            BuildEventImportance.High, "Important Message",
           "SimpleTask");
        BuildEngine.LogBuildEvent(taskEvent);
        return true;
    }
}

Обязательные параметры задачи

Некоторые свойства задачи можно пометить как "обязательные", чтобы в любом файле проекта, из которого запускается задача, необходимо было задавать значения для этих свойств, иначе построение выполнить не удастся. Примените к свойству .NET в задаче атрибут [Required] следующим образом:

private string requiredProperty;

[Required]
public string RequiredProperty
{
    get { return requiredProperty; }
    set { requiredProperty = value; }
}

Атрибут [Required] определен свойством RequiredAttribute в пространстве имен Microsoft.Build.Framework.

Пример

Описание

В этом классе Visual C# показана задача, получаемая из вспомогательного класса Task. Эта задача возвращает значение true, указывающее на успешность ее выполнения.

Код

using System;
using Microsoft.Build.Utilities;

namespace SimpleTask1
{
    public class SimpleTask1: Task
    {
        public override bool Execute()
        {
            // This is where the task would presumably do its work.
            return true;
        }
    }
}

Пример

Описание

В этом классе Visual C# показана задача, реализующая интерфейс ITask. Эта задача возвращает значение true, указывающее на успешность ее выполнения.

Код

using System;
using Microsoft.Build.Framework;

namespace SimpleTask2
{
    public class SimpleTask2: ITask
    {
        //When implementing the ITask interface, it is necessary to
        //implement a BuildEngine property of type
        //Microsoft.Build.Framework.IBuildEngine. This is done for
        //you if you derive from the Task class.
        private IBuildEngine buildEngine;
        public IBuildEngine BuildEngine
        {
            get
            {
                return buildEngine;
            }
            set
            {
                buildEngine = value;
            }
         }

        // When implementing the ITask interface, it is necessary to
        // implement a HostObject property of type Object.
        // This is done for you if you derive from the Task class.
        private Object hostObject;
        public Object HostObject
        {
            get
            {
                return hostObject;
            }

            set
            {
                hostObject = value;
            }
        }

        public bool Execute()
        {
            // This is where the task would presumably do its work.
            return true;
        }
    }
}

Пример

Описание

В этом классе Visual C# показана задача, получаемая из вспомогательного класса Task. В ней задается обязательное свойство строки и создается событие, отображаемое всеми зарегистрированными средствами ведения журнала.

Код

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace SimpleTask3
{
    public class SimpleTask3 : Task
    {
        private string myProperty;

        // The [Required] attribute indicates a required property.
        // If a project file invokes this task without passing a value
        // to this property, the build will fail immediately.
        [Required]
        public string MyProperty
        {
            get
            {
                return myProperty;
            }
            set
            {
                myProperty = value;
            }
        }

        public override bool Execute()
        {
            // Log a high-importance comment
            Log.LogMessage(MessageImportance.High,
                "The task was passed \"" + myProperty + "\".");
            return true;
        }
    }
}

Пример

Описание

В этом примере показан файл проекта, в котором вызывается задача из предыдущего примера (SimpleTask3).

Код

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="SimpleTask3.SimpleTask3" 
        AssemblyFile="SimpleTask3\bin\debug\simpletask3.dll"/>

    <Target Name="MyTarget">
        <SimpleTask3 MyProperty="Hello!"/>
    </Target>
</Project>

См. также

Другие ресурсы

Справочные сведения о задачах MSBuild

Справочные сведения о задачах MSBuild

Журнал изменений

Дата

Журнал

Причина

Июнь 2010

Замена BuildImportance на MessageImportance.

Исправление ошибки содержимого.