MSBuild 101 – Parte 6 – Propriedades e Itens Dinâmicos

Publicado em 07/08/2011

0


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:

image

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 …

image

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:

image

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.

Smiley piscando

Etiquetado:
Publicado em: Sem categoria