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
Odpowiedzi:
Upewnij się, że dzwonisz:
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:
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:
źródło
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:
źródło
Redistributables and Build Tools
sekcji.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:
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:
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.
źródło