Compartilhar via


Tarefas embutidas do MSBuild

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.

Iniciando no .NET Framework versão 4, você pode criar as tarefas embutido no arquivo de projeto. Você não tem que criar um conjunto separado para hospedar a tarefa. Isso facilita manter controle de origem 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="12.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.v12.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, nesse 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 embutida de fábrica de tarefas, que está localizado geralmente em cachê global de assemblies (GAC).

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

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

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

  • O elemento de Reference especifica referências aos conjuntos de .NET que você está usando em seu código. Isso é equivalente a adicionar uma referência a um projeto no 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 do .NET CodeDom, por exemplo, Visual Basic ou Visual c#.

Dica

Os elementos contidos pelo elemento de Task são específicos para a fábrica de tarefas, nesse caso, a factory de tarefa de código.

Elemento 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 C#, vb para Visual Basic.

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 marcador 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, para<"" ou de "">.

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 está 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.

Dica

Ao 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 de erro, que é normalmente o console do sistema ou a janela do Visual Studio Saída . O elemento de Reference no exemplo é incluído apenas para a ilustração.

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

Entrada e parâmetros de saída

Os parâmetros internos de tarefas são elementos filho 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 desses atributos:

  • Required é um atributo opcional que é false por padrão. Se verdadeiro, 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 em uma cadeia de caracteres usando System.Convert.ChangeType. (Ou seja um tipo que pode ser passado em uma tarefa externo.)

  • Output é um atributo opcional que é false por padrão. Se verdadeiro, então o parâmetro deve ser fornecido 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 necessária do 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 coincidir exatamente com 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="12.0">

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

Instruções passo a passo: criando uma tarefa embutida

Conceitos

Tarefas do MSBuild