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çã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. |
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 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çã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