c# msbuild teamcity webdeploy

c# - Publicar un proyecto web desde la solución con msbuild.



teamcity webdeploy (2)

Hay una solución mucho más simple para esto. MSBuild admite apuntar a un solo proyecto mientras construye la solución. Para ello, coloque el nombre del proyecto en el parámetro Destino. Tenga en cuenta que este es el nombre visual del proyecto que especifica en la solución (no necesariamente el mismo que el nombre del archivo .csproj).

Nota: el único "truco" necesario aquí es reemplazar los puntos (.) En el nombre del proyecto con guiones bajos (_) .

Ejemplo de línea de comandos de MSBuild, si el nombre de su proyecto es "Your.Project.Name":

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

También puede especificar un objetivo de compilación para ese proyecto, pero este objetivo debe existir para todos los proyectos en la solución:

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

Fuentes

  1. Esto está parcialmente documentado en MSDN desde Visual Studio 2008: https://msdn.microsoft.com/en-us/library/ms164311(v=vs.140).aspx
  2. Un agradecimiento especial a Vasil Trifonov por señalar el truco de reemplazo: http://www.codeproject.com/Articles/654910/How-to-build-a-specific-project-from-a-solution-wi

Estoy intentando implementar uno de los proyectos web en mi solución en un servidor. Estoy usando msbuild en TeamCity así:

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

Sin embargo, cuando lo ejecuto, msbuild aún intenta construir mi proyecto de Servicio WebSite , aunque mi proyecto de WebSite no depende de él (pero sí depende de un proyecto de Services en la solución). ¿Cómo publicar solo un proyecto, también conocido como WebSite ?

También he intentado construir el archivo de proyecto usando

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

pero luego se queja de que no puede restaurar paquetes:

[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.

Cuando deshabilito NuGet Package Restore, CoreCompile (Csc) falla con errores que nunca escuché y que no debería estar ocurriendo:

[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.


Hice un blog sobre esto en http://sedodream.com/2013/03/06/HowToPublishOneWebProjectFromASolution.aspx hace unos meses. He copiado los detalles aquí también, ver más abajo.

Hoy en twitter @nunofcosta me formuló la pregunta "¿Cómo publico un proyecto web desde una solución que contiene muchas?"

El problema con el que se está ejecutando es que está compilando desde la línea de comandos y pasando las siguientes propiedades a msbuild.exe.

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

Puede leer más sobre cómo automatizar la publicación en http://sedodream.com/2013/01/06/CommandLineWebProjectPublishing.aspx .

Cuando pasa estas propiedades a msbuild.exe, se conocen como propiedades globales. Estas propiedades son difíciles de anular y se pasan a cada proyecto que se construye. Debido a esto, si tiene una solución con múltiples proyectos web, cuando se construye cada proyecto web, se pasa en el mismo conjunto de propiedades. Debido a esto, cuando se construye cada proyecto, se iniciará el proceso de publicación para ese proyecto y se esperará encontrar un archivo llamado siteone - Web Deploy.pubxml en la carpeta * Propiedades / Publicación Perfiles *. Si el archivo no existe, la operación puede fallar.

Nota: Si está interesado en utilizar esta técnica para una publicación orquestada, consulte mis comentarios en https://.com/a/14231729/105999 antes de hacerlo.

Entonces, ¿cómo podemos resolver esto?

Echemos un vistazo a una muestra (ver enlaces a continuación). Tengo una solución, PublishOnlyOne , con los siguientes proyectos.

  1. ProjA
  2. ProjB

ProjA tiene un perfil de publicación llamado '' siteone - Web Deploy '', ProjB no. Al intentar publicar esto, puede probar la siguiente línea de comando.

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

Ver publish-sln.cmd en las muestras.

Si hace esto, cuando llegue el momento de que ProjB lo compile, fallará porque no hay ningún sitio: perfil de Despliegue Web para ese proyecto. Debido a esto, no podemos pasar DeployOnBuild. En cambio, aquí está lo que tenemos que hacer.

  1. Edite ProjA.csproj para definir otra propiedad que establecerá de forma condicional DeployOnBuild
  2. Desde la línea de comando pasar en esa propiedad

Edité ProjA y agregué el siguiente grupo de propiedades antes de las declaraciones de importación en el archivo .csproj.

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

Aquí puede ver que DeployOnBuild está configurado en cualquier valor que DeployProjA sea mientras no esté vacío. Ahora el comando revisado es:

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

Aquí, en lugar de pasar a DeployOnBuild, paso a DeployProjA que luego establecerá DeployOnBuild. Dado que DeployOnBuild no se pasó a ProjB, no se intentará publicar.

Puede encontrar la muestra completa en https://github.com/sayedihashimi/sayed-samples/tree/master/PublishOnlyOne .