Olá pessoal, tudo certo?
Esse é o sexto post tratando de MSBuild. Volto essa série depois de uma longa pausa.
No post de hoje, tratamos um pouco sobre propriedades e itens dinâmicos. Não pretendo esgotar o assunto, mas vou mostrar alguns fundamentos para criação de projetos usando esses recursos.
Por que precisamos de propriedades e itens dinâmicos durante o Build?
Na maioria das vezes, quando estamos montando o processo de build, é suficiente utilizar propriedades e itens estáticos. Ou seja, aquelas definidas fora dos targets. Por exemplo, geralmente sabemos quais arquivos vamos compilar e quais opções de configuração pretendemos utilizar. Entretanto, há cenários onde precisamos criar propriedades e itens durante o processo de build. Por exemplo, se desejarmos, após o processo de compilação, desejarmos copiar os arquivos binários que foram gerados para algum lugar, precisaremos descobrir quais são esses arquivos.
Propriedades e itens criadas enquanto o processo de build é executado são chamadas propriedades dinâmicas e itens dinâmicos, respectivamente.
Propriedades no MSBuild 3.5 (e superiores)
A partir do MSBuild 3.5, há a possibilidade de utilizar os nodos PropertyGroup e ItemGroup dentro das targets. Com isso, podemos declarar itens e propriedades diâmicas de maneira similar a que já estamos acostumados para propriedades e itens estáticos. Observe:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunAll" > <PropertyGroup> <MyProperty>Original value</MyProperty> </PropertyGroup> <Target Name="p1"> <Message Text="MyProperty (p1)= $(MyProperty)"/> </Target> <Target Name="p2"> <PropertyGroup> <MyProperty>New Value</MyProperty> </PropertyGroup> <Message Text="MyProperty (p2)= $(MyProperty)"/> </Target> <Target Name="RunAll" DependsOnTargets="p1;p2"/> </Project>
Executando o MSBuild, temos:
Como podemos ver, o valor da propriedade MyProperty é “substituído” dinamicamente dentro do target p2.
Repare que também podemos criar propriedades novas:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunAll" > <PropertyGroup> <MyProperty>Original value</MyProperty> </PropertyGroup> <Target Name="p1"> <Message Text="MyProperty (p1)= $(MyProperty)"/> </Target> <Target Name="p2"> <PropertyGroup> <MyProperty>New Value</MyProperty> <MyProperty2>Value Of MyProperty2</MyProperty2> </PropertyGroup> <Message Text="MyProperty (p2)= $(MyProperty)"/> <Message Text="MyProperty2 = $(MyProperty2)"/> </Target> <Target Name="RunAll" DependsOnTargets="p1;p2"/> </Project>
Resultado …
Itens no MSBuild 3.5 (e superiores)
O problema com itens estáticos é que eles são sempre resolvidos antes que qualquer target seja executado. Se precisarmos de uma lista composta por itens gerados durante o processo de build precisamos utilizar listas dinâmicas.
Para criar “itens dinâmicos” temos que usar o nodo ItemGroup dentro de um target. Observe:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <ItemGroup> <Person Include="p1"> <Name>Elemar Junior</Name> <Age>31</Age> <Contact>Elemar Junior</Contact> </Person> <Person Include="p2"> <Name>Gabriel Severo</Name> <Age>10</Age> <Contact>Elemar Junior</Contact> </Person> <Person Include="p3"> <Name>Bruna Severo</Name> <Age>2</Age> <Contact>Simone Severo</Contact> </Person> </ItemGroup> <Target Name="pInfo"> <Message Text="%(Person.Name), %(Person.Age), %(Person.Contact)"/> <Message Text="Changing Contact" Importance="high"/> <ItemGroup> <Person Condition="'%(Person.Contact)'=='Elemar Junior'"> <Contact>Elemar JR</Contact> </Person> </ItemGroup> <Message Text="%(Person.Name), %(Person.Age), %(Person.Contact)"/> <Message Text="Removing p1" Importance="high"/> <ItemGroup> <Person Remove="p1"/> </ItemGroup> <Message Text="%(Person.Name), %(Person.Age), %(Person.Contact)"/> </Target> </Project>
Executando esse projeto, temos:
Como pode perceber, primeiro mostrei como modificar valores. Depois, mostrei como remover um item da coleção.
Os exemplos que apresentei foram “genéricos” e não relacionados com processos de build. Entretanto, servem como embasamento para posts futuros (que espero publicar com frequência melhor).
Pronto! Era isso.
![]()






Publicado em 07/08/2011
0