Escrita de tarefa

Tarefas fornecem o código que executa durante o processo de compilação. As tarefas estão contidas nos destinos. Uma biblioteca de tarefas típicas está incluída no MSBuild, e você também pode criar suas próprias tarefas. Para obter mais informações sobre a biblioteca de tarefas que estão incluídos no MSBuild, consulte Referência de tarefa do MSBuild.

Tarefas

Exemplos de tarefas Copy, que copia um ou mais arquivos, MakeDir, que cria um diretório, e Csc, que compila Visual C# arquivos de código de origem. Cada tarefa é implementada como um.NET classe que implementa o ITask interface, que é definido no assembly Microsoft.Build.Framework.dll.

Há duas abordagens que você pode usar durante a implementação de uma tarefa:

  • Implementar a ITask interface diretamente.

  • Sua classe derivar da classe auxiliar, Task, que é definido no assembly Microsoft.Build.Utilities.dll. Tarefa implementa ITask e fornece implementações padrão alguns membros ITask. Além disso, o log é mais fácil.

Em ambos os casos, você deve adicionar à sua classe um método chamado Execute, que é o método que é chamado quando a tarefa é executada. Esse método sem parâmetros e retorna um Boolean valor: trueSe a tarefa foi bem-sucedida ou false se ele falha. O exemplo a seguir mostra uma tarefa que não executa nenhuma ação e retorna true.

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

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

O arquivo de projeto a seguir executa essa tarefa:

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

Quando as tarefas executadas, elas também podem receber entradas do arquivo de projeto se você criar.NET propriedades da classe da tarefa. MSBuilddefine essas propriedades imediatamente antes de chamar a tarefa Execute método. Para criar uma propriedade de cadeia de caracteres, use o código da tarefa, como:

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; }
        }
    }
}

O seguinte arquivo será executado de projeto desta tarefa e os conjuntos de MyProperty para o valor fornecido:

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

Registrando tarefas

Se for um projeto para executar uma tarefa, MSBuild deve saber como localizar o assembly que contém a classe de tarefa. Tarefas são registradas usando o UsingTask elemento (MSBuild).

O MSBuild Microsoft.Common.Tasks é um arquivo de projeto que contém uma lista de UsingTask elementos que registrar todas as tarefas que são fornecidas com MSBuild. Este arquivo é incluído automaticamente durante a criação de cada projeto. Se uma tarefa que está registrada no Microsoft.Common.Tasks também é registrada no arquivo de projeto atual, o arquivo de projeto atual prevalece; ou seja, você pode substituir uma tarefa padrão com sua própria tarefa que tem o mesmo nome.

Dica

Você pode ver uma lista das tarefas que são fornecidos com MSBuild , exibindo o conteúdo de Microsoft.Common.Tasks.

Gerar eventos a partir de uma tarefa

Se sua tarefa deriva o Task classe auxiliar, você pode usar qualquer um dos seguintes métodos auxiliares na Task classe para gerar eventos a ser detectados e exibidos por qualquer loggers registrados:

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

Se sua tarefa implementa ITask diretamente, você ainda pode elevar eventos, mas você deve usar a interface IBuildEngine. O exemplo a seguir mostra uma tarefa que implementa o ITask e gera um evento personalizado:

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;
    }
}

Exigir que os parâmetros da tarefa a ser definido

Você pode marcar determinadas propriedades de tarefa como "obrigatórias" para que qualquer arquivo de projeto que executa a tarefa deve definir os valores dessas propriedades ou a construção falhar. Aplicar o atributo de**[Required]** para o.NET a propriedade na sua tarefa da seguinte maneira:

private string requiredProperty;

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

O [Required] atributo é definido por RequiredAttribute na Microsoft.Build.Framework namespace.

Exemplo

Descrição

Seguir Visual C# classe demonstra uma tarefa de derivar o Task classe de auxiliar. Esta tarefa retorna true, indicando que ele teve êxito.

Código

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;
        }
    }
}

Exemplo

Descrição

Seguir Visual C# classe demonstra uma tarefa de implementar a ITask interface. Esta tarefa retorna true, indicando que ele teve êxito.

Código

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;
        }
    }
}

Exemplo

Descrição

Isso Visual C# classe demonstra uma tarefa que deriva do Task classe de auxiliar. Ele tem uma propriedade de cadeia de caracteres necessários e gera um evento que é exibido por todos os registradores registrados.

Código

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;
        }
    }
}

Exemplo

Descrição

O exemplo a seguir mostra um arquivo de projeto, a tarefa de exemplo anterior, SimpleTask3.

Código

<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>

Consulte também

Outros recursos

Referência de tarefa do MSBuild

Referência de tarefa do MSBuild

Histórico de alterações

Date

History

Motivo

Junho de 2010

Substitua BuildImportance MessageImportance.

Correção de bug de conteúdo.