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