Jak zaktualizować MSBuild do C # 6?


106

Chcę używać C # 6 w moim projekcie (propagacja wartości null, inne funkcje).

Zainstalowałem VS 2015 na moim komputerze i działa świetnie i buduje kod testowy, taki jak

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

Ale kiedy wypycham projekt do repozytorium, a CI zaczyna go budować, kompilacja kończy się niepowodzeniem z powodu nieobsługiwanego ?.

Zainstalowałem VS2015 również na serwerze CI, ale wygląda na to, że go nie używa. Co mogę zrobić?

CI - CruiseControl .NET Kompiluje z C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe


3
Każdemu pobierania narzędzi budowania MS 2015 z linków podanych poniżej, są one dla starego (pre-update) wersji, która ma błędów ... Znalazłem link tutaj do 2015 Aktualizacja 3.
bdrajer

Odpowiedzi:


164

Upewnij się, że dzwonisz:

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

To jest wersja MsBuild, która jest dostarczana z programem Visual Studio 2015 i wywołuje kompilator C #, który to rozumie. Tę wersję programu MsBuild można pobrać w systemie, instalując dowolną wersję programu Visual Studio 2015 lub instalując autonomiczne narzędzia Microsoft Build Tools 2015 .

Dodanie odwołania do następującego pakietu NuGet również wymusi użycie nowego kompilatora:

Install-Package Microsoft.Net.Compilers

Należy pamiętać, że pakiet Install-Package wybierze najnowszą dostępną wersję, która może nie być tą, której szukasz. Przed instalacją zapoznaj się z informacjami o wersji i zależnościami, aby rozwiązać podstawowy problem z wersją, z którą mamy do czynienia, który w tym przypadku był bardziej specyficzny dla VS 2015.

Tak więc w przypadku programu Visual Studio 2015:

Install-Package Microsoft.Net.Compilers -Version 1.0.0

2
czy są jakieś obawy, że to powoduje błędy, ponieważ RyuJIT lub cokolwiek innego ma tak wiele błędów?
Maslow

3
Tylko uwaga na ten temat, jeśli aktualizujesz zmienną PATH env, pamiętaj o usunięciu starej lokalizacji (np .: C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319), ponieważ może to nadal wywoływać podczas wykonywania "msbuild "z cmd
TheWebGuy

2
Musiałem także zainstalować pakiet
NuGet

2
Czy istnieje rozwiązanie tego problemu bez konieczności instalowania pakietu NuGet w każdym projekcie? Mam setki projektów, które tego potrzebowały i wydaje mi się to niepotrzebne. Wygląda na to, że gdzieś jest błąd.
Cole W

2
Czy ktoś ma odpowiedź na pytanie @ColeW?
Zinov

61

Przy okazji możesz także zainstalować „Microsoft Build Tools 2015” zamiast VS2015 na swoim serwerze kompilacji.

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

Instaluje MSBuild w tej samej ścieżce:

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

IMHO jest przyczyna, dlaczego pytanie dotyczy tego środowiska. Lepiej skomentuj pytanie.
jogo

24
Ponieważ stackoverflow nie pozwala mi komentować pytań, opublikowałem to w jedyny sposób, na jaki pozwalają mi systemy. A jeśli nie uznasz tego za przydatne, po prostu je zignoruj. Dla mnie, szukając rozwiązania na moim serwerze kompilacji, była to droga, zamiast instalować VS2015
MuhKuh

Po zainstalowaniu „Microsoft Build Tools 2015” (lub „Microsoft Build Tools 2017”) masz również kontrolę nad wersją programu Visual Studio, której chcesz użyć do zbudowania rozwiązania: MSBuild.exe / t: Build YourSolution.sln / p : VisualStudioVersion = 14.0 [ustaw na 10.0 dla VS2010, na 14.0 dla VS2015 i 15.0 dla VS2017]
Alex Sanséau

Aby pobrać i zainstalować Microsoft Build Tools 2015 Update 3 , odwiedź starsze pliki do pobrania VS i przejdź do Redistributables and Build Toolssekcji.
RBT

12

Prawdopodobnie już to działa, ale może to pomóc komuś innemu w przyszłości. Niedawno natknąłem się na to pytanie, które skłoniło mnie do pójścia we właściwym kierunku i ostatecznie doprowadziło do rozwiązania.

Innym możliwym rozwiązaniem tego problemu jest ręczne aktualizowanie plików projektu, aby były przeznaczone dla wersji programu MSBuild, na podstawie której mają być tworzone projekty.

Niedawno przeszedłem przez aktualizację serwera kompilacji TeamCity i już zainstalowałem na niej Microsoft Build Tools 2015. Wydawało mi się, że mam wszystko na serwerze kompilacji, moje rozwiązanie jest przeznaczone dla języka C # 6.0, a każdy projekt był przeznaczony dla .net 4.6.1. Podobnie jak Ty, wszystko z kodem specyficznym dla C # 6.0 zbudowanym dobrze w moim środowisku lokalnym, ale mój serwer kompilacji TeamCity nie podobał się temu.

Jak wspominali inni, próbowałem użyć pakietu Microsoft.Net.Compilers NuGet. Najnowsza wersja pozwalała na pracę kompilacji na moim serwerze kompilacji, ale nie pozwalała mi publikować kodu lokalnie (moje wymaganie). Wcześniejsze wersje tego pakietu NuGet umożliwiałyby mi publikowanie, ale kompilacja nie działała.

Okazało się, że musiałem ostatecznie zmodyfikować każdy plik projektu w moim rozwiązaniu, aby ukierunkować go na wersję programu MSBuild, która może obsługiwać kod C # 6.0. W każdym z moich plików projektu znalazłem wiersz podobny do następującego:

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

kluczowym składnikiem tego wiersza jest jego część ToolsVersion . Po prostu zmieniłem ten wiersz w moich plikach projektu, aby przeczytać następujące informacje:

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

Różnica polegała na tym, że celowałem w wersję 14, a nie 4. Wersja 14.0 odpowiada Build Tools 2015. Zmieniając to, mój serwer kompilacji TeamCity używał poprawnej wersji MSBuild i był w stanie zbudować mój kod C # 6.0.

Musiałem również ręcznie zaktualizować węzeł XML TargetFrameworkVersion tego, aby używać 4.6.1, ponieważ VS2015 nie robił czegoś dobrze i zepsuło moją lokalną kompilację, ale to nie ma znaczenia tutaj.

Proszę, ktoś popraw mnie, jeśli się mylę, ale dla odniesienia myślę, że numery wersji wyglądają mniej więcej tak:

4,0 = VS2012

12,0 = VS2013

14,0 = VS2015

15,0 = VS2017

Uważam, że gdybyś chciał używać .net 4.7, musiałbyś mieć zainstalowany Build Tools 2017 i mieć projekty skierowane na 15.0 zamiast 14.0, ale nie zweryfikowałem tego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.