Olá pessoal, tudo certo?
Nos posts anteriores, apresentamos os principais elementos de um arquivo de configuração para MSBuild. Hoje demonstro como colocar condicionais a esses elementos.
A utilização de condicionais é um artifício extremamente poderoso que nos permite ter, em um único arquivo de configuração, diversos roteiros de build. MSBuild permite que praticamente todos os seus elementos XML tenham uma condição associada.
Vamos ao que interessa …
Posts anteriores dessa série
Se está chegando agora, talvez queira ler o que já foi escrito nessa série. Considere a leitura dos posts anteriores. São eles:
Visão geral para condicionais
Adicionar condicionais a elementos de configuração é uma atividade extremamente simples. Basta adicionar um atributo Condition cujo o valor será a condição que desejamos validar. Se a condição presente nesse atributo resultar “false”, então todo o elemento (bem como seus filhos) serão ignorados.
Abra um arquivo .csproj e verifque como o Visual Studio faz uso intensivo de condicionais em suas propriedades.
Criando um valor default para propriedades
Como você verá, o MSBuild permite que você defina valores para propriedades pela linha de comando. Em muitos casos, seria interessante, entretanto, ter um valor default para uma propriedade caso ela não tenha sido especificada. O exemplo que segue demonstra como fazer isso. Observe:
1 <?xml version="1.0" encoding="utf-8"?> 2 <Project 3 xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 4 DefaultTarget="build" 5 > 6 <PropertyGroup> 7 <Configuration 8 Condition="'$(Configuration)'==''" 9 >Release</Configuration> 10 </PropertyGroup> 11 12 <Target Name="build"> 13 <Message Text="Configuration = $(Configuration)"/> 14 </Target> 15 </Project>
Perceba que a propriedade Configuration possui uma condição ‘$Configuration’==’’ . Basicamente, estamos verificando se a propriedade tem um valor definido. A utilização das aspas simples, mesmo estranha, é obrigatória para que tenhamos uma condição válida.
Executando o MSBuild para o arquivo de configuração especificado, temos a seguinte saída:
1 C:\git\MSBuild101>msbuild Condition1.proj /nologo 2 Build started 28/01/2011 09:33:17. 3 Project "C:\git\MSBuild101\Condition1.proj" on node 1 (default targets). 4 build: 5 Configuration = Release 6 Done Building Project "C:\git\MSBuild101\Condition1.proj" (default targets). 7 8 9 Build succeeded. 10 0 Warning(s) 11 0 Error(s) 12 13 Time Elapsed 00:00:00.04
Observe que, como a propriedade Configuration não foi definida na linha de comando, assumiu o valor Release.
Agora, vamos executar o mesmo script definindo um valor para a propriedade na linha de comando.
1 C:\[..]>msbuild Condition1.proj /Property:Configuration=Debug 2 Build started 28/01/2011 09:34:17. 3 Project "C:\git\MSBuild101\Condition1.proj" on node 1 (default targets). 4 build: 5 Configuration = Debug 6 Done Building Project "C:\git\MSBuild101\Condition1.proj" (default targets). 7 8 9 Build succeeded. 10 0 Warning(s) 11 0 Error(s) 12 13 Time Elapsed 00:00:00.04
Na linha 1, podemos observar como definir valor para uma propriedade para uma linha de comando. Dessa vez, repare que o valor especificado na linha de comando prevaleceu sobre aquele definido no arquivo de configuração. Isso ocorreu, em função da condicional.
Criando uma lista de arquivos usando condicionais
Como já foi dito, qualquer elemento de um arquivo MSBuild pode receber o atributo Condition. No próximo exemplo, estou condicionando a “inclusão” de um arquivo a configuração de build. Observe:
1 <?xml version="1.0" encoding="utf-8"?> 2 <Project 3 xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 4 DefaultTarget="build" 5 > 6 <PropertyGroup> 7 <Configuration 8 Condition="'$(Configuration)'==''" 9 >Release</Configuration> 10 </PropertyGroup> 11 12 <ItemGroup> 13 <Content Include="demo.cs"/> 14 <Content 15 Include="demo2.cs" 16 Condition="'$(Configuration)'=='Debug'" 17 /> 18 19 </ItemGroup> 20 21 <Target Name="build"> 22 <Message Text="Configuration = $(Configuration)"/> 23 <Message Text="Content = @(Content)"/> 24 </Target> 25 </Project>
No exemplo apresentado, o arquivo “demo2” é considerado somente quando a configuração for debug.
Segue execução do script com o valor default para Configuration. Ou seja, Release. Observe:
1 C:\git\MSBuild101>msbuild Cond2.proj 2 Microsoft (R) Build Engine Version 4.0.30319.1 3 [Microsoft .NET Framework, Version 4.0.30319.1] 4 Copyright (C) Microsoft Corporation 2007. All rights reserved. 5 6 Build started 28/01/2011 09:45:14. 7 Project "C:\git\MSBuild101\Cond2.proj" on node 1 (default targets). 8 build: 9 Configuration = Release 10 Content = demo.cs 11 Done Building Project "C:\git\MSBuild101\Cond2.proj" (default targets). 12 13 14 Build succeeded. 15 0 Warning(s) 16 0 Error(s) 17 18 Time Elapsed 00:00:00.04
Agora, vamos rodar o mesmo Script colocando Debug da propriedade Configuration
1 C:\git\MSBuild101>msbuild Cond2.proj /nologo /Property:Configuration=Debug 2 Build started 28/01/2011 09:47:09. 3 Project "C:\git\MSBuild101\Cond2.proj" on node 1 (default targets). 4 build: 5 Configuration = Debug 6 Content = demo.cs;demo2.cs 7 Done Building Project "C:\git\MSBuild101\Cond2.proj" (default targets). 8 9 10 Build succeeded. 11 0 Warning(s) 12 0 Error(s) 13 14 Time Elapsed 00:00:00.04
Como explicitado anteriormente, agora temos dois arquivos sendo “considerados” por nosso script.
Outros operadores para Condicionais no MSBuild
Além do operador de igualdade, usado em todos os exemplos até aqui, há outros três operadores que podem ser utilizados em condicionais do MSBuild. Considere:
- diferença (!=) – ex: Condition=”’Configuration’!=’Debug’”
- existência de um arquivo (Exists) – ex: Condition=”Exists(‘filename.fe’)”
- inexistência de um arquivo (!Exists) = ex: Condition=”!Exists(‘filename.fe’)”
Por hoje, era isso…
![]()






Daniel Moreira Yokoyama
10/09/2011
E quanto a operadores lógicos? And, Or, Not?
elemarjr
10/09/2011
Use And, Or e !