2013-06-03 17 views
25

Sto provando a distribuire uno dei progetti Web nella mia soluzione su un server. Sto usando msbuild su TeamCity in questo modo:Pubblicare un progetto Web dalla soluzione con msbuild

msbuild MySolution.sln /t:WebSite:Rebuild /p:DeployOnBuild=True /p:PublishProfile=Prod ... 

Tuttavia, quando l'eseguo, MSBuild cerca ancora di costruire il mio progetto WebService, anche se il mio progetto WebSite non dipende da esso (ma non dipende da un Services progetto anche nella soluzione). Come si pubblica un solo progetto, ovvero solo WebSite?

Ho anche provato la costruzione del file di progetto utilizzando

msbuild WebSite/WebSite.csproj /p:DeployOnBuild=True ... 

ma poi si lamenta che non è possibile ripristinare i pacchetti:

[07:47:17]WebSite\WebSite.csproj.teamcity: Build target: Build 
[07:47:17][WebSite\WebSite.csproj.teamcity] RestorePackages 
[07:47:17][RestorePackages] Exec 
[07:47:17][Exec] C:\TeamCity\buildAgent\work\cab8a3d752df3a51\.nuget\NuGet.targets(90, 15): error MSB4064: The "LogStandardErrorAsError" parameter is not supported by the "Exec" task. Verify the parameter exists on the task, and it is a settable public instance property. 
[07:47:17][Exec] C:\TeamCity\buildAgent\work\cab8a3d752df3a51\.nuget\NuGet.targets(89, 9): error MSB4063: The "Exec" task could not be initialized with its input parameters. 
[07:47:17][WebSite\WebSite.csproj.teamcity] Project WebSite\WebSite.csproj.teamcity failed. 

Quando disattivo NuGet pacchetto Restore, CoreCompile (Csc) fallisce con errori di cui non ho mai sentito parlare e non dovrebbe accadere:

[07:54:43]WebSite\WebSite.csproj.teamcity: Build target: Build (13s) 
[07:54:55][WebSite\WebSite.csproj.teamcity] CoreCompile 
[07:54:55][CoreCompile] Csc 
[07:54:56][Csc] Areas\Api\Services\TripService.cs(19, 104): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(11, 35): error CS1031: Type expected 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(11, 53): error CS1002: ; expected 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(16, 28): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(16, 37): error CS1519: Invalid token ',' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(17, 27): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(17, 32): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 17): error CS1519: Invalid token 'for' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 26): error CS1519: Invalid token '<=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 45): error CS1519: Invalid token '-' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(23, 51): error CS1519: Invalid token '++' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 34): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 37): error CS1519: Invalid token '==' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 51): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(24, 63): error CS1519: Invalid token '++' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(25, 41): error CS1519: Invalid token '>' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(25, 53): error CS1519: Invalid token ')' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(27, 36): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(27, 48): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(28, 36): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 37): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 48): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(29, 50): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 33): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 44): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(30, 50): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(32, 21): error CS0116: A namespace does not directly contain members such as fields or methods 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(35, 50): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(38, 21): error CS0116: A namespace does not directly contain members such as fields or methods 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(40, 50): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\StatisticsUtility.cs(42, 21): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(8, 59): error CS1031: Type expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(8, 80): error CS1002: ; expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 55): error CS1519: Invalid token '(' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 60): error CS1520: Class, struct, or interface method must have a return type 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(10, 82): error CS1002: ; expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(13, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(15, 60): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(18, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(20, 25): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(23, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(26, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 24): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 84): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(32, 28): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(35, 9): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(23, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(26, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 22): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(29, 83): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Helpers\UrlHelperExtensions.cs(32, 26): error CS0101: The namespace '<global namespace>' already contains a definition for '?' 
[07:54:56][Csc] Controllers\SessionController.cs(13, 51): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 44): error CS1031: Type expected 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 72): error CS1041: Identifier expected, 'object' is a keyword 
[07:54:56][Csc] Helpers\JsonNetResult.cs(13, 91): error CS1002: ; expected 
[07:54:56][Csc] Helpers\JsonNetResult.cs(16, 38): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(16, 59): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(17, 64): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(17, 90): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(18, 32): error CS1519: Invalid token '=' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(18, 46): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(19, 33): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
[07:54:56][Csc] Helpers\JsonNetResult.cs(22, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(25, 37): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(32, 23): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(35, 37): error CS1518: Expected class, delegate, enum, interface, or struct 
[07:54:56][Csc] Helpers\JsonNetResult.cs(40, 9): error CS1022: Type or namespace definition, or end-of-file expected 
[07:54:56][Csc] Mailers\ITripMailer.cs(13, 132): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Mailers\TripMailer.cs(54, 85): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Services\Impl\AuthorizationService.cs(12, 70): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][Csc] Services\Impl\AuthorizationService.cs(43, 77): error CS0241: Default parameter specifiers are not permitted 
[07:54:56][WebSite\WebSite.csproj.teamcity] Project WebSite\WebSite.csproj.teamcity failed. 

risposta

48

I blog ged su questo a http://sedodream.com/2013/03/06/HowToPublishOneWebProjectFromASolution.aspx alcuni mesi fa. Ho copiato anche qui i dettagli, vedi sotto.


Oggi su twitter @nunofcosta mi ha chiesto circa la domanda “Come faccio a pubblicare un progetto web da una soluzione che contiene molti?”

Il problema che sta funzionando in è che si sta costruendo dal riga di comando e passando le seguenti proprietà a msbuild.exe.

/p:DeployOnBuild=true 
/p:PublishProfile='siteone - Web Deploy' 
/p:Password=%password% 

Si può leggere di più su come automatizzare la pubblicazione a http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx.

Quando si passano queste proprietà a msbuild.exe esse sono note come proprietà globali. Queste proprietà sono difficili da ignorare e vengono passate a ogni progetto che viene creato. Per questo motivo se si dispone di una soluzione con più progetti Web, quando ciascun progetto Web viene creato viene passato nello stesso insieme di proprietà. Per questo motivo, quando viene creato ciascun progetto, verrà avviato il processo di pubblicazione per quel progetto e si prevede di trovare un file denominato siteone - Web Deploy.pubxml nella cartella * Properties \ PublishProfiles *. Se il file non esiste, l'operazione potrebbe non riuscire.

Nota: se si è interessati a utilizzare questa tecnica per una pubblicazione orchestrata, consultare i miei commenti allo https://stackoverflow.com/a/14231729/105999 prima di procedere.

Quindi, come possiamo risolvere questo?

Diamo un'occhiata a un campione (vedi link sotto). Ho una soluzione, PublishOnlyOne, con i seguenti progetti.

  1. proja
  2. ProjB

proja ha un profilo di pubblicazione di nome ‘siteone - Web Deploy’, ProjB non lo fa.Quando provi a pubblicare questo puoi provare la seguente riga di comando.

msbuild.exe PublishOnlyOne.sln /p:DeployOnBuild=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password% 

vedere Pubblicare-sln.cmd nei campioni.

Se si esegue questa operazione, quando il suo tempo per ProjB per costruire fallirà perché non c'è siteone - Web Deploy profilo per quel progetto. Per questo motivo, non possiamo passare a DeployOnBuild. Invece qui è quello che dobbiamo fare.

  1. Modifica ProjA.csproj per definire un'altra proprietà che condizionalmente impostare DeployOnBuild
  2. Dal passo riga di comando in quella proprietà

Ho modificato proja e aggiunto il seguente gruppo di proprietà prima che le dichiarazioni di importazione nella il file .csproj.

<PropertyGroup> 
<DeployOnBuild Condition=" '$(DeployProjA)'!='' ">$(DeployProjA)</DeployOnBuild> 
</PropertyGroup> 

Qui si può vedere che DeployOnBuild è impostato su qualunque DeployProjA valore è fino a quando non è vuota. Ora il comando rivisto è:

msbuild.exe PublishOnlyOne.sln /p:DeployProjA=true /p:PublishProfile=’siteone – Web Deploy’ /p:Password=%password% 

Qui invece di passare DeployOnBuild, passo in DeployProjA che sarà quindi impostare DeployOnBuild. Poiché DeployOnBuild non è stato passato a ProjB, non tenterà di pubblicare.

È possibile trovare il campione completo a https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne.

+0

interessante resoconto! Questo ha sicuramente un senso. Tuttavia, ho risolto il mio problema creando un file msbuild basato su un'altra domanda su SO: http://stackoverflow.com/questions/3097489/how-to-publish-web-with-msbuild –

+1

Questa è stata una risposta molto intelligente e volevo ringraziarti moltissimo per questo.Ha risolto un problema serio per me! –

+0

Meraviglioso! Questo è esattamente ciò di cui avevo bisogno e ho funzionato perfettamente, grazie per la risposta e l'ottimo post sul blog –

12

C'è una soluzione molto più semplice per questo. MSBuild supporta il targeting di un singolo progetto mentre crea la soluzione. Lo fai inserendo il nome del progetto nel parametro Target. Si noti che questo è il nome visivo del progetto specificato nella soluzione (non necessariamente lo stesso del nome del file .csproj).

Nota: l'unico "trucco" necessario qui è a sostituire i punti (.) Nel nome del progetto con caratteri di sottolineatura (_).

riga di comando

Esempio MSBuild, se il nome del progetto è "Your.Project.Name":

msbuild.exe YourSolutionName.sln /T:"Your_Poject_Name" /P:DeployOnBuild=true /P:PublishProfile=YourPublishProfile.pubxml 

È inoltre possibile specificare un obiettivo di build per quel progetto, ma questo obiettivo dovrebbe esistere per tutti i progetti in soluzione:

msbuild.exe YourSolutionName.sln /T:"Your_Poject_Name:Rebuild" /P:DeployOnBuild=true /P:PublishProfile=YourPublishProfile.pubxml 

Fonti

  1. Th si è parzialmente documentata in MSDN dal Visual Studio 2008: grazie https://msdn.microsoft.com/en-us/library/ms164311(v=vs.140).aspx
  2. speciale a Vasil Trifonov per indicare la sostituzione trucco: http://www.codeproject.com/Articles/654910/How-to-build-a-specific-project-from-a-solution-wi
+0

Funziona, ma non sembra che crei tutte le dipendenze del progetto web. Ho provato questo facendo riferimento a una libreria di classi e quindi eseguendo il comando msbuild. Ha errato dicendo che non riusciva a trovare la biblioteca. – Remotec

+0

Questo dovrebbe funzionare mentre stiamo usando questa tecnica nelle configurazioni CI server (VS2015). Assicurati che la tua libreria di classi sia impostata su "Build" sotto la rispettiva configurazione della soluzione (che è a sua volta selezionata nel profilo di pubblicazione). – arni

Problemi correlati