Como atualizar o msbuild para C # 6?

106

Desejo usar C # 6 em meu projeto (propagação nula, outros recursos).

Instalei o VS 2015 no meu PC e ele funciona de maneira brilhante e cria códigos de teste como

var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];

Mas quando eu envio meu projeto para o repo e o CI começa a compilá-lo, a compilação falha por não ser compatível ?.

Também instalei o VS2015 no servidor CI, mas parece que não o usa. O que eu posso fazer?

CI - CruiseControl .NET Builds with C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Anna Prosvetova
fonte
3
Para qualquer um que esteja baixando o MS Build Tools 2015 a partir dos links abaixo, eles são para uma versão antiga (pré-atualização) que tem bugs ... Encontrei um link aqui para 2015 Atualização 3.
bdrajer

Respostas:

164

Certifique-se de ligar para:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe

Essa é a versão do MsBuild que acompanha o Visual Studio 2015 e chama o compilador C # que entende isso. Você pode obter esta versão do MsBuild em seu sistema instalando qualquer edição do Visual Studio 2015 ou instalando o autônomo Microsoft Build Tools 2015 .

Adicionar uma referência ao seguinte pacote NuGet também forçará o uso do novo compilador:

Install-Package Microsoft.Net.Compilers

Observe que o Install-Package escolherá a versão mais recente disponível, que pode não ser a que você está procurando. Antes de instalar, verifique as notas de lançamento e dependências para resolver o problema subjacente com a versão sendo tratada, que neste caso, era mais específico para VS 2015.

Então, para Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0
Jessehouwing
fonte
2
há alguma preocupação sobre isso causar bugs desde o RyuJIT ou o que quer que tenha tantos bugs?
Maslow
3
Apenas uma observação sobre isso, se você estiver atualizando sua variável env PATH, certifique-se de remover o local antigo (ex: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) porque ele ainda pode chamar isso ao executar "msbuild "do cmd
TheWebGuy
2
Eu também tive que instalar o pacote nuget Microsoft.Net.Compilers: consulte stackoverflow.com/a/36774876/584714
DrGriff
2
Existe uma solução para isso sem a necessidade de instalar um pacote nuget em cada projeto? Tenho centenas de projetos que precisam disso e me parecem desnecessários. Parece um bug em algum lugar.
Cole W
2
Alguém tem uma resposta para a pergunta @ColeW?
Zinov
61

A propósito, você também pode instalar o "Microsoft Build Tools 2015" em vez do VS2015 em seu servidor de compilação.

https://www.microsoft.com/en-us/download/details.aspx?id=48159

Ele instala o MSBuild no mesmo caminho:

C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
MuhKuh
fonte
IMHO há uma causa, por que a questão se relaciona com esse ambiente. Melhor fazer um comentário sobre a pergunta.
jogo
24
Como o stackoverflow não me permite comentar sobre as perguntas, eu postei da única maneira que o sistema permite. E se você não achar que é útil, simplesmente ignore. Para mim, enquanto procurava a solução no meu servidor de compilação, este foi o caminho a percorrer, em vez de instalar o VS2015
MuhKuh
Depois de instalar "Microsoft Build Tools 2015" (ou "Microsoft Build Tools 2017"), você também tem controle sobre qual versão do Visual Studio deseja usar para criar a solução: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [defina-o para 10.0 para VS2010, para 14.0 para VS2015 e 15.0 para VS2017]
Alex Sanséau
Para baixar e instalar o Microsoft Build Tools 2015 Update 3 , visite os downloads do VS mais antigos e vá para a Redistributables and Build Toolsseção.
RBT
12

Você provavelmente já fez isso funcionar, mas isso pode ajudar outra pessoa no futuro. Eu me deparei com essa questão recentemente e ela me fez seguir na direção certa e, finalmente, me levou a uma solução.

Outra solução possível para isso é atualizar manualmente seus arquivos de projeto para direcionar a versão do MSBuild com a qual você deseja que seus projetos sejam criados.

Recentemente, passei por uma atualização do servidor de compilação TeamCity e já instalei o Microsoft Build Tools 2015 nele. Achei que tinha tudo pronto no servidor de compilação, tinha minha solução voltada para C # 6.0 e todos os projetos voltados para .net 4.6.1. Como você, tudo com código específico do C # 6.0 construído perfeitamente em meu ambiente local, mas meu servidor de compilação TeamCity não gostou de nada disso.

Conforme mencionado por outros, tentei usar o pacote NuGet Microsoft.Net.Compilers. A versão mais recente permitiu que a construção funcionasse no meu servidor de construção, mas não me deixou publicar meu código localmente (um requisito meu). Versões anteriores desse pacote NuGet me permitiam publicar, mas a construção não funcionava.

O que descobri que tinha que fazer foi modificar cada arquivo de projeto em minha solução para direcionar especificamente a versão do MSBuild que poderia lidar com o código C # 6.0. Em cada um dos meus arquivos de projeto, encontrei uma linha semelhante à seguinte:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

com o componente principal dessa linha sendo a parte ToolsVersion dela. Simplesmente mudei esta linha em meus arquivos de projeto para ler o seguinte:

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

A diferença aqui era que eu estava visando a versão 14, não 4. A versão 14.0 corresponde ao Build Tools 2015. Ao alterar isso, meu servidor de build TeamCity usou a versão correta do MSBuild e foi capaz de construir meu código C # 6.0.

Eu também tive que atualizar manualmente o nó xml TargetFrameworkVersion deste para usar 4.6.1 porque o VS2015 não estava fazendo algo certo e bagunçou minha compilação local, mas isso não é relevante aqui.

Por favor, alguém me corrija se eu estiver errado, mas apenas para referência, acho que os números das versões são mais ou menos assim:

4.0 = VS2012

12,0 = VS2013

14,0 = VS2015

15.0 = VS2017

Eu acredito que se você quisesse usar .net 4.7, você teria que ter o Build Tools 2017 instalado e ter seus projetos visando 15.0 em vez de 14.0, mas eu não verifiquei isso.

user1059903
fonte