2016-05-03 55 views
6

Ho una build su TeamCity che pacchetta un progetto web pronto per l'implementazione successiva, attualmente in uso con MSBuild 2013. Quando ho inviato qualche codice recentemente ho ricevuto errori di compilazione (dovuto al fatto che stavo usando un po 'di C# 6 funzioni) così sono andato a cambiare la configurazione di generazione di utilizzare MSBuild 2015, invece, e ottenuto questo errore:MSBuild 2015 pubblicare: Impossibile trovare AspnetMergePath valido

[Error] C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets(132, 5): Can't find the valid AspnetMergePath

questo errore è stato detto in altre domande prima (come ad esempio qui: VS 2012 Publish: Can't find the valid AspnetMergePath) ma sfortunatamente nessuna delle correzioni menzionate in quelle domande ha funzionato per me.

Le cose che ho già provato o erano già avviene:

  • Web e webapplication directory dalla macchina locale (in C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v14.0) hanno stato copiato fino a costruire del server (sono sempre stati lì)
  • Aggiunto <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\</TargetFrameworkSDKToolsDirectory> a Microsoft.Web.Publishing.AspNetCompileMerge.targets file di
  • Aggiunto /p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\" al comando MSBuild

Sono un po 'in perdita con questo: praticamente l'unica cosa che non ho provato è installare Visual Studio sul server di build, ma mi piacerebbe davvero evitarlo se posso (perché io pensa che sia ridicolo dover installare un IDE completo su un server CI!).

Alcune ulteriori informazioni:

  • tutto continua a funzionare bene se si passa la generazione di nuovo a MSBuild il 2013 (anche se, ovviamente, non vogliamo rimanere bloccati nel passato)
  • siamo avere un certo numero di altri pura compilazione generazioni sono in esecuzione contro MSBuild 2015 senza errori
+0

hai risolto questo? –

+0

Non ho paura; dopo circa due giorni ho appena tirato le mani in aria e ho appena installato Visual Studio :( – Richiban

+0

@Richiban perché hai installato VS2015 :) la soluzione è "semplice" come in questa risposta https://stackoverflow.com/a/16694597/441301: Copia la cartella 'C: \ Programmi (x86) \ MSBuild \ Microsoft \ VisualStudio \ v14' da una macchina Dev al server di build, quindi modifica' Microsoft.Web.Publishing.AspNetConfigurationMerge.targets' e aggiungi '' come nel collegamento. Nel mio caso ho usato * [...] v8.1A \ bin \ NETFX 4.5.1 Strumenti *, ma funziona anche se hai l'SDK di Windows 10 ... troppo tardi per te, ma forse aiuta qualcun altro. Non è più necessario specificare '/ p: AspnetMergePath';) – firepol

risposta

5

Sia la seconda e la terza soluzione originariamente proposto sul VS 2012 Publish: Can't find the valid AspnetMergePath effettivamente fare il lavoro, ma deve essere fornita la versione corretta degli strumenti SDK.

L'articolo originale (VS 2012 Publish: Can't find the valid AspnetMergePath) è stato scritto nel 2013 e copre il Visual Studio 2012. Il aspnet_merge.exe che supporta C# 6.0 e .NET 4.6 non è quella che si trova nel percorso "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\".

Per far funzionare la terza soluzione, utilizzare il seguente percorso invece "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\".

In oder parole, aggiungendo/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\"di comando MSBuild risolve il problema.

La mia squadra ha avuto esattamente lo stesso problema di quello che si sta descrivendo e l'aggiunta di questo parametro al passo MSBuild l'ha risolta immediatamente. (Presumo ovviamente che tu abbia la versione NETFX 4.6 degli strumenti sul tuo computer di costruzione.

Come nota a margine, dal momento che hai detto che usi Team City - invece di aggiungere il parametro precedente direttamente come parametro della riga di comando, puoi utilizzare Team City raccomandato e configure the corresponding build parameter.

+3

Ho dovuto aggiungere un percorso di unione più specifico per farlo funzionare su VS15. Ho usato '/ p: AspnetMergePath =" C: \ Programmi (x86) \ Microsoft SDK \ Windows \ v10.0A \ bin \ NETFX 4.6 Strumenti \ aspnet_merge.exe "' specificando anche il reale, non solo il percorso. –

+0

Dove aggiungere esattamente questo comando? Progetto web -> proprietà -> Crea evento? – DoomerDGR8

+1

@ DoomerDGR8 '/ p: AspnetMergePath' è un parametro MSBuild, non un comando. La domanda originale riguarda l'impostazione durante l'esecuzione di MSBuild su una macchina di compilazione (significa che esegue MSBuild.exe come strumento da riga di comando). Nel tuo caso, almeno io interpreto la tua domanda in questo modo, vuoi passare questo parametro a MSBuild da Visual Studio. VS (2015 e seguenti) non supportano la definizione dei parametri di MSBuild nella GUI. Per aggiungerlo e usarlo in VS, dovresti aggiungerlo direttamente al file * .csproj. [Questa risposta] (http://stackoverflow.com/a/18343396/7025570) spiega come farlo (vedi la parte "Aggiorna" di esso). – ironcev

1

La risposta accettata è solo un trattamento sintomatico e non affronta il problema sottostante. Esegui MSBuild con diagnostic logging. Se guardi lo Microsoft.Web.Publishing.AspNetCompileMerge.targets vedrai che tenta di concatenare TargetFrameworkSDKToolsDirectory con AspnetMergeName. Se cerchi nel tuo registro MSBuild, troverai che TargetFrameworkSDKToolsDirectory è vuoto. TargetFrameworkSDKToolsDirectory è generato da TargetFrameworkSDKDirectory che è anche vuoto.

Questo è ciò che è necessario risolvere. Nel mio caso:

  • Installare l'SDK di Windows 7.1 (utilizzando this workaround su Windows Server 2016).
  • In VS2017 il percorso è determinato in base a /configuration/msbuildToolsets/toolset/property[@name="FrameworkSDKRoot] che è nel mio caso Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\[email protected]. Nel mio caso questo nodo era disponibile solo nello WOW6432Node, ma deve essere disponibile anche nel registro a 64 bit. È necessario copiare il nodo nella posizione equivalente nel registro a 64 bit.