Tarefas do MSBuild in-line

Tarefas do MSBuild normalmente são criadas por meio da compilação de uma classe que implementa o ITask interface. Para obter mais informações, consulte Tarefas do MSBuild.

No.NET Framework versão 4, você pode criar tarefas embutido no arquivo de projeto. Não é necessário criar um assembly separado para hospedar a tarefa. Isso torna mais fácil de manter o controle de código-fonte e a tarefa de implantar. O código-fonte é integrado ao script.

A estrutura de uma tarefa in-line

Uma tarefa embutida contida por um UsingTask elemento. A tarefa de linha e a UsingTask o elemento que o contém normalmente são incluídos em um arquivo. targets e importados para outros arquivos de projeto, conforme necessário. Aqui está uma tarefa básica in-line. Observe que ela 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 UsingTask o elemento no exemplo tem três atributos que descrevem a tarefa e a fábrica de tarefa embutido que compila o proprietário.

  • O TaskName nomes de atributo da tarefa, nesse caso, DoNothing.

  • O TaskFactory nomes de atributo da classe que implementa a fábrica de tarefa in-line.

  • O AssemblyFile atributo fornece o local da fábrica de tarefa in-line. Como alternativa, você pode usar o AssemblyName atributo para especificar o nome totalmente qualificado da classe embutida tarefa factory, que geralmente está localizado no cache global de assemblies (GAC).

Os elementos restantes da DoNothing tarefa estão vazia e são fornecidos para ilustrar a ordem e a estrutura de uma tarefa in-line. Um exemplo mais robusto será apresentado posteriormente neste tópico.

  • O ParameterGroup elemento é opcional. Quando especificado, ele declara os parâmetros para a tarefa. Para obter mais informações sobre parâmetros de entrada e saídas, consulte "Entrada e saída parâmetros" neste tópico.

  • O Task elemento descreve e contém o código de origem de tarefa.

  • O Reference elemento Especifica as referências para o.NET que você está usando no seu código. Isso equivale ao adicionar uma referência a um projeto Visual Studio. O Include atributo especifica o caminho do assembly referenciado.

  • O Using elemento lista os espaços para nome que você deseja acesso. Isso é semelhante a Using a instrução no Visual C#. O Namespace atributo especifica o namespace para incluir.

Referencee Using elementos são idiomas-independente. Tarefas de linha podem ser escritas em qualquer um com o suporte.Idiomas NET CodeDom, por exemplo, Visual Basic, C# Visual e JScript.

ObservaçãoObservação

Elementos contidos no Task elemento são específicas para o tarefa factory, nesse caso, a fábrica de tarefa de código.

Elemento de código

O último elemento filho apareça dentro do Task elemento é o Code elemento. O Code elemento contém ou localiza o código que você deseja ser compilados em uma tarefa. O que você coloca o Code elemento depende de como você deseja gravar a tarefa.

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

O Type atributo especifica o tipo de código que é encontrado na Code elemento.

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

  • Se o valor de Type é método, e em seguida, o código define uma substituição da Execute método o ITask interface.

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

O próprio código normalmente aparece entre um <![CDATA[ marcador e um ]]> marcador. Porque o código está em uma seção CDATA, você não precisa se preocupar sobre a saída de caracteres reservados, por exemplo, "<" ou ">".

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

ObservaçãoObservação

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

Hello World

Aqui está uma tarefa de linha mais robusta. A tarefa de HelloWorld exibe "Hello, world!" no dispositivo de log de erros padrão, que é geralmente o console do sistema ou o Visual Studio saída janela. O Reference o elemento no exemplo é incluído apenas para 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 de HelloWorld em um arquivo chamado HelloWorld.targets e, em seguida, chamá-la de um projeto da seguinte maneira.

<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

Parâmetros da tarefa in-line são elementos filho de um ParameterGroup elemento. Cada parâmetro usa o nome do elemento que a define. O código a seguir define o parâmetro Text.

<ParameterGroup>

<Text />

</ParameterGroup>

Parâmetros podem ter um ou mais desses atributos:

  • Requiredé um atributo opcional que é false por padrão. Se true, em seguida, o parâmetro é obrigatório e deve ser dado um valor antes de chamar a tarefa.

  • ParameterTypeé um atributo opcional que é System. String por padrão. Ela pode ser definida para qualquer tipo totalmente qualificado que é um item ou um valor que pode ser convertido em uma seqüência de caracteres usando o System.Convert.ChangeType. (Em outras palavras, qualquer tipo que pode ser passado para e de uma tarefa externa.)

  • Outputé um atributo opcional que é false por padrão. Se true, e em seguida, o parâmetro deve ser dado um valor antes de retornar do método Execute.

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ário do tipo System. String.

  • Filesé um parâmetro de entrada de lista de item obrigatório.

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

Se a Code elemento tem o Type atributo do fragmento ou método, e propriedades são criadas automaticamente para cada parâmetro. Caso contrário, as propriedades devem ser declaradas explicitamente o código de origem da tarefa e devem corresponder exatamente a suas definições de parâmetro.

Exemplo

A tarefa de linha a seguir substitui todas as ocorrências de um token no arquivo fornecido 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

Walkthrough: Para criar uma tarefa in-line

Conceitos

Tarefas do MSBuild