Compartilhar via


Tarefas do MSBuild in-line

As tarefas do MSBuild são criadas normalmente criando uma classe que implementa a interface de ITask .Para obter mais informações, consulte Tarefas do MSBuild.

Em o .NET Framework versão 4, você pode criar as tarefas embutidas no arquivo de projeto.Você não tem que criar um conjunto separado para hospedar a tarefa.Isso facilita manter controle de código fonte e fácil implantar a tarefa.O código-fonte é integrado ao script.

A estrutura de uma tarefa in-line

Uma tarefa in-line está contida por um elemento de UsingTask .A tarefa embutido e o elemento de UsingTask que a contém normalmente são incluídos em um arquivo .targets e importados em outros arquivos de projeto conforme necessário.Aqui está uma tarefa embutido básica.Observe que não fará nada.

<Project ToolsVersion="4.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.v4.0.dll" >
    <ParameterGroup />
    <Task>
      <Reference Include="" />
      <Using Namespace="" />
      <Code Type="Fragment" Language="cs">
      </Code>
    </Task>
  </UsingTask>
</Project>

O elemento de UsingTask no exemplo tem três atributos que descrevem a tarefa e o factory embutida de tarefa que a compilação.

  • O atributo de TaskName nomeia a tarefa, em esse caso, DoNothing.

  • O atributo de TaskFactory nomeia a classe que implementa a fábrica embutida de tarefa.

  • O atributo de AssemblyFile fornece o local de fábrica embutida de tarefa.Como alternativa, você pode usar o atributo de AssemblyName para especificar o nome totalmente qualificado da classe interna de fábrica de tarefas, que está localizado normalmente no global assembly cache (GAC).

Os elementos restantes de tarefa de DoNothing estão vazios e são fornecidas para ilustrar a ordem e a estrutura de uma tarefa embutido.Um exemplo mais robusto é apresentado posteriormente em este tópico.

  • o elemento de ParameterGroup é opcional.Quando especificado, declare os parâmetros para a tarefa.Para obter mais informações sobre entrada e dos parâmetros de saída, consulte “para encaixar mais tarde e parâmetros de saída” em este tópico.

  • O elemento de Task descreve e contém código-fonte de tarefas.

  • O elemento de Reference especifica referências a assemblies .NET que você está usando em seu código.Isso é equivalente a adicionar uma referência a um projeto em Visual Studio.O atributo de Include especifica o caminho do assembly referenciado.

  • O elemento de Using lista os namespaces que você deseja acessar.Isso é semelhante à declaração de Using visual C#.O atributo de Namespace especifica o namespace para incluir.

Reference e elementos de linguagem Using são desconhecidos.As tarefas in-line podem ser gravadas em ambos os idiomas com suporte .NET CodeDom, por exemplo, Visual Basic, visual C#, e JScript.

ObservaçãoObservação

Elementos contido no elemento de Task são específicos para a fábrica de tarefas, em esse caso, a factory de tarefa de código.

Dd722601.collapse_all(pt-br,VS.110).gifelemento de código

O elemento filho o último para aparecer dentro do elemento de Task é o elemento de Code .O elemento de Code contém ou localize o código que você deseja ser compilado em uma tarefa.O que você coloca no elemento de Code depende de como você deseja escrever a tarefa.

O atributo de Language especifica a linguagem em que seu código é gravado.Os valores aceitáveis são .cs para vb para C#, Visual Basic, e js para JScript.

O atributo de Type especifica o tipo de código que está localizado no elemento de Code .

  • Se o valor de Type é Classe, então o elemento de Code contém o código para uma classe que deriva de interface de ITask .

  • Se o valor de Type é Método, o código define uma substituição do método de Execute de interface de ITask .

  • Se o valor de Type é fragmento, o código define o conteúdo do método de Execute , mas não a assinatura ou a declaração de return .

O próprio código normalmente aparece entre um item de <![CDATA[ e um marcador de ]]> .Porque o código está em uma seção CDATA, você não tem que se preocupar no escape de caracteres reservados, por exemplo, "<" ou ">".

Como alternativa, você pode usar o atributo de Source do elemento de Code para especificar o local de um arquivo que contém o código para sua tarefa.O código no arquivo de origem deve ser do tipo que é especificado pelo atributo de Type .Se o atributo de Source estiver presente, o valor padrão de Type é Classe.Se Source não está presente, o valor padrão é fragmento.

ObservaçãoObservação

A o definir a classe de tarefa no arquivo de origem, o nome da classe deve de acordo com o atributo de TaskName do elemento correspondente de UsingTask .

Hello World

Aqui está uma tarefa embutido mais robusta.A tarefa HelloWorld exibe “hello, world!” no dispositivo de log padrão do erro, que é normalmente o console do sistema ou a janela do Visual Studio Saída .O elemento de Reference no exemplo é incluída apenas para a ilustração.

<Project ToolsVersion="4.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>

Você pode salvar a tarefa HelloWorld em um arquivo que foi chamado HelloWorld.targets e em seguida, invoke de um projeto como segue.

<Project ToolsVersion="4.0" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="HelloWorld.targets" />
  <Target Name="Hello">
    <HelloWorld />
  </Target>
</Project>

Parâmetros de entrada e saída

Os parâmetros internos de tarefas são elementos filhos de um elemento de ParameterGroup .Cada parâmetro leva o nome do elemento que o define.O código a seguir define o parâmetro Text.

<ParameterGroup>
    <Text />
</ParameterGroup>

Os parâmetros podem ter um ou mais de esses atributos:

  • Required é um atributo opcional que é false por padrão.Se true, então o parâmetro é necessário e deve ser fornecido um valor antes de chamar a tarefa.

  • ParameterType é um atributo opcional que é System.String por padrão.Pode ser definido como qualquer tipo totalmente qualificado que seja um item ou um valor que pode ser convertido para e de uma cadeia de caracteres usando System.Convert.ChangeType.(Ou seja um tipo que pode ser passado para e de uma tarefa externo.)

  • Output é um atributo opcional que é false por padrão.Se true, então o parâmetro deve ter um valor antes de retornar o método executar.

Por exemplo,

<ParameterGroup>
    <Expression Required="true" />
      <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
    <Tally ParameterType="System.Int32" Output="true" />
</ParameterGroup>

define esses três parâmetros:

  • Expression é um parâmetro de entrada requerida de tipo System.String.

  • Files é um parâmetro de entrada necessária da lista de item.

  • Tally é um parâmetro de saída do tipo System.Int32.

Se o elemento de Code tem o atributo de Type de fragmento ou Método, então as propriedades são criados automaticamente para cada parâmetro.Caso contrário, as propriedades devem ser explicitamente declarados no código-fonte de tarefas, e devem corresponder exatamente a suas definições de parâmetro.

Exemplo

A seguinte tarefa in-line substitui cada ocorrência de um símbolo no arquivo dado com o valor fornecido.

<Project xmlns='https://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="4.0">

  <UsingTask TaskName="TokenReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.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>

Consulte também

Tarefas

Passo a passo: Criando uma tarefa de in-line

Conceitos

Tarefas do MSBuild