segunda-feira, 9 de novembro de 2009

Como compilar projetos do Visual Studio para diferentes versões do .NET Framework

Estamos criando uma aplicação WPF no Visual Studio 2010 (beta 1), mas o Blend 3 não carrega assemblies compilados para .NET Framework 4.0. Então na máquina do nosso designer (chique hein), que é quem usa o Blend, tivemos que compilar uma versão do projeto para o Framework 3.5.
Um parêntesis: na nossa equipe temos um designer, um gerente de produto e um gerente de projetos. QUEM É QUE CODIFICA, meu Deus? Depois os cara ficam surpreso porque o projeto está atrasado…
Achamos um artigo falando sobre uma opção do MSBuild – o engine de compilação automatizada da Microsoft – para gerar código para uma versão específica do .NET Framework: /toolsversion. Eu achava que o MSBuild (de uma breve experiência anterior) era uma ferramenta super difícil de se trabalhar, mas a integração dele com projetos do Visual Studio tornou a tarefa ridiculamente fácil. Criamos um .bat que recompila todos os projetos da solução. Um trecho dele está a seguir:
msbuild StorageClient\StorageClient.csproj /toolsversion:3.5 /verbosity:quiet
if ERRORLEVEL 1 goto erro
O MSBuild reconhece arquivos de projeto do Visual Studio, e já ativa o compilador correspondente. A opção /toolsversion indica para qual Framework o código deve ser gerado (valores permitidos: 2.0, 3.0, 3.5 e 4.0), e sobrepõe a definição no arquivo de projeto. O if seguinte checa se a saída do MSBuild foi 1 – o que sinaliza erro. Desta forma você pode abortar a compilação dos outros projetos da solução (usando o bom (?) e velho goto).
Também vamos usar esta solução na geração das tabelas no Azure Development Storage, pois o DevTableGen – o utilitário que gera as tabelas – não suporta assemblies do Framework 4.0.
O diretório do MSBuild não está no path default de uma janela de linha de comando, então use o Visual Studio 2010 Command Prompt (grupo de programas do VS 2010 > Visual Studio 2010 Tools), que já tem o MSBuild no seu path.