2015-12-18 26 views
10

Per un vecchio progetto che supporto, ho eseguito alcuni interventi di modernizzazione. Ciò ha incluso varie cose: urtare .NET Framework fino a 4.6 e altri aggiornamenti. Una delle cose che abbiamo un po 'di margine di manovra è fare aggiornamenti sintattici, a condizione che non cambiamo la logica di business.String Interpolation non si baserà su TeamCity

Abbiamo anche installato di recente Visual Studio 2015 e l'ultimo e più grande ReSharper, che ha rivelato che "String Interpolation" è ora qualcosa che possiamo fare nel nostro codice. Per coloro che non conoscono, stringa di interpolazione è zucchero sintattico sopra string.Format chiamate come qui sotto:

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

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

Questo è veramente utile perché rende i messaggi molto più facile da leggere, e di solito da occupare meno caratteri.

... Eppure, TeamCity sembra non essere d'accordo. Quando ho spinto il codice in un commit, ho ottenuto il seguente errore:

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

In superficie, sembra come un pre-C# 6 costruttore di qualche tipo è stato colpito, perché questa è una nuova funzionalità a C# 6.

Ecco quello che ho osservato è per questo che teorizzano che questo è quello che sta succedendo:

  1. La configurazione di generazione sta indicando C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe questo mi dà una pausa, a causa presumibilmente .NET 4.6 è installato sul nostro accumulo agente.

  2. Nel tentativo di installare direttamente .NET 4.6 dal programma di installazione di Microsoft, tuttavia, non riesce perché .NET 4.6 è già installato sull'agent bulid.

  3. Il passo di compilazione della nostra configurazione build mi dà anche una pausa. Le prime due righe che rilevano rispettivamente la versione di Build Engine e framework sono [exec] Microsoft (R) Build Engine version 4.6.1055.0 [exec] [Microsoft .NET Framework, version 4.0.30319.42000] Il motore di build è apparentemente v4.6, ma .NET framework è 4.0 !? Sto leggendo giusto?

  4. Infine, una delle righe finali del registro di build: [NAnt output] External Program Failed: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe (return code was 1) Questo è non 4.6 ... è?

Domanda: duplice. Questa prima domanda potrebbe essere stupida, ma sto compilando effettivamente contro .NET 4.6? In secondo luogo, in che modo posso ottenere la sintassi di Interpolazione stringa in C# 6 per la creazione effettiva, se sto puntando su .NET 4.6?

Mi manca chiaramente qualcosa di su tutto questo, non sono sicuro A) quante cose mi mancano, o B) cosa dovrei fare esattamente su di loro.

risposta

26

Mi sento giustificato; il percorso/versione divertente era infatti indicativo del vero problema: lo MSBuild.exe che veniva eseguito non era quello installato da VS2015.

Come ho letto from here, la versione di MSBuild.exe che si trova in C:\Windows\Microsoft.NET\Framework\v4.0.30319 è in realtà una versione pre-C# 6; per qualche ragione, l'installazione di Visual Studio 2015 fa non alterare tale installazione!

Invece è necessario indirizzare la chiamata MSBuild.exe alla copia memorizzata su C:\Program Files (x86)\MSBuild\14.0\Bin per la compilazione rispetto alla versione C# più recente, come installato da VS2015.

+4

Per completezza, in realtà non è necessario installare VS2015 su ciascun agente di creazione; può diventare piuttosto ingombrante se ne hai diversi. Basta installare [Microsoft Build Tools 2015] (https://www.microsoft.com/en-us/download/details.aspx?id=48159) e TeamCity dovrebbe ritenerlo soddisfatto nei Requisiti dell'agente. Quindi puoi selezionare Strumento di costruzione 2015 nel tuo passo MSBuild (se è quello che stai usando). – SteveChapman

+0

In realtà usiamo uno script NAnt, con un percorso per il builder che vogliamo usare ... ma, questo è un buon suggerimento! Grazie. –

Problemi correlati