2015-12-18 10 views
10

W przypadku starego projektu, który popieram, dokonałem pewnych modernizacji. Obejmuje to różne rzeczy: wpadanie w .NET Framework do wersji 4.6 i inne uaktualnienia. Jedną z rzeczy, które mamy do wykonania, jest wykonanie aktualizacji składniowych, o ile nie zmienimy logiki biznesowej.Interpolacja z ciągami nie będzie opierać się na TeamCity

Niedawno zainstalowaliśmy również Visual Studio 2015 oraz najnowszy i najlepszy program ReSharper, który ujawnił, że "interpolacja ciągów" jest teraz czymś, co możemy zrobić w naszym kodzie. Dla tych, którzy nie wiedzą, interpolacja ciąg jest cukier syntaktyczny nad string.Format połączeń, jak poniżej:

// Normal, pre-C#6 formatting: 
var foo = string.Format("Some string {0}", bar); 

// C#6 String Interpolation 
var foo = $"Some string {bar}"; 

Jest to bardzo przydatne, ponieważ to sprawia, że ​​komunikaty o wiele łatwiejsze do odczytania, a zazwyczaj poprzez objęcie mniej znaków.

... Jednak TeamCity wydaje się nie zgadzać. Kiedy pchnął kodu w górę w commit, mam następujący błąd:

Directory\SomeFile.cs: error CS1056: Unexpected character '$' [C:\ProjectDirectory\Project.Core\Project.Core.csproj] 

Na pierwszy rzut oka wydaje się, że pre-C# 6 budowniczego jakiejś jest bycie hitem, ponieważ jest to nowa funkcja do C# 6.

Oto co zaobserwowali, że dlatego teoretyzować, że to, co się dzieje:

  1. Konfiguracja build jest skierowany do C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe To daje mi wstrzymać, ponieważ przypuszczalnie .NET 4.6 jest zainstalowany na naszej budowie agent.

  2. Jednak próba bezpośredniej instalacji .NET 4.6 z instalatora firmy Microsoft nie powiedzie się, ponieważ program .NET 4.6 jest już zainstalowany w agencie bulid.

  3. Nasz etap kompilacji konfiguracji kompilacji również daje mi pauzę. Dwie pierwsze linie, które odnotowują odpowiednio wersję silnika budowania i architektury, to: [exec] Microsoft (R) Build Engine version 4.6.1055.0 [exec] [Microsoft .NET Framework, version 4.0.30319.42000] Silnik kompilacji najwyraźniej v4.6, ale framework .NET to 4.0 !? Czy to czytam, prawda?

  4. Wreszcie jedna z ostatnich linii dziennika budowy: [NAnt output] External Program Failed: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe (return code was 1) To jest nie 4.6 ... czy to jest?

Pytanie: dwojaki. To pierwsze pytanie może być głupie, ale czy rzeczywiście kompiluję się przeciwko .NET 4.6? Po drugie, w jaki sposób można uzyskać składnię String Interpolation w C# 6 do rzeczywistej kompilacji, jeśli wskazuję na .NET 4.6?

Ja wyraźnie brakuje coś o tym wszystkim, nie jestem pewien A) ile rzeczy brakuje mi, lub B) co dokładnie powinienem zrobić z nimi.

Odpowiedz

26

Czuję się usprawiedliwiony; Zabawna ścieżka/wersja była w rzeczywistości wskaźnikiem prawdziwego problemu: uruchomiona wersja MSBuild.exe nie była instalowana przez VS2015.

Jak czytam , wersja MSBuild.exe, która znajduje się w C:\Windows\Microsoft.NET\Framework\v4.0.30319 jest w rzeczywistości wersją sprzed C# 6; z jakiegoś powodu zainstalowanie programu Visual Studio 2015 powoduje, że , a nie zmienić tę instalację!

Zamiast tego należy skierować swoje wywołanie MSBuild.exe do kopii przechowywanej pod adresem C:\Program Files (x86)\MSBuild\14.0\Bin w celu kompilacji z najnowszą wersją C#, zainstalowaną przez VS2015.

+4

Dla kompletności, nie trzeba instalować VS2015 na każdym agencie kompilacji; może to być dość uciążliwe, jeśli masz kilka. Po prostu zainstaluj [Microsoft Build Tools 2015] (https://www.microsoft.com/en-us/download/details.aspx?id=48159) i TeamCity powinien wybrać to jako spełnione w wymaganiach agenta. Następnie możesz wybrać Build Tool 2015 na swoim kroku MSBuild (jeśli tego właśnie używasz). – SteveChapman

+0

Używamy skryptu NAnt ze ścieżką do konstruktora, którego chcemy użyć ... ale to dobra sugestia! Dzięki. –