Cómo publicar web con msbuild?

Visual Studio 2010 tiene un comando Publicar que le permite publicar su Proyecto de aplicación web en una ubicación del sistema de archivos. Me gustaría hacer esto en mi servidor de comstackción de TeamCity, así que tengo que hacerlo con el corredor de soluciones o msbuild. Intenté usar el objective de publicación, pero creo que podría ser para ClickOnce:

msbuild Project.csproj /t:Publish /p:Configuration=Deploy 

Básicamente, quiero hacer exactamente lo que hace un proyecto de implementación web, pero sin el complemento. Necesito comstackr el WAP, eliminar cualquier archivo innecesario para su ejecución, realizar cualquier transformación de web.config y copiar el resultado en una ubicación específica.

Mi solución , basada en la respuesta de Jeff Siver

     

Obtuve principalmente trabajando sin un script personalizado de msbuild. Estas son las configuraciones de comstackción de TeamCity relevantes:

 Rutas de artefactos:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp 
 Tipo de corredor: MSBuild (Runner para archivos MSBuild) 
 Build file path: MyProject \ MyProject.csproj 
 Directorio de trabajo: igual que el directorio de pago 
 Versión de MSBuild: Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion: 4.0 
 Plataforma de ejecución: x86 
 Objetivos: paquete 
 Parámetros de línea de comando a MSBuild.exe: / p: Configuration = Debug

Esto comstackrá, empacará (con la transformación web.config) y guardará la salida como artefactos. Lo único que falta es copiar el resultado en una ubicación específica, pero eso podría hacerse en otra configuración de comstackción de TeamCity con una dependencia de artefactos o con un script de msbuild.

Actualizar

Aquí hay un script de msbuild que comstackrá, empaquetará (con la transformación web.config) y copiará el resultado a mi servidor de transferencia

    Release MySolution $(SolutionName).sln MyProject $(ProjectName)\$(ProjectName).csproj              

También puede eliminar las propiedades SolutionName y ProjectName de la etiqueta PropertyGroup y pasarlas a msbuild.

 msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject 

Actualización 2

Dado que esta pregunta todavía recibe mucho tráfico, pensé que valía la pena actualizar mi respuesta con mi script actual que usa Web Deploy (también conocido como MSDeploy).

   Release $(ProjectName)\$(ProjectName).csproj http://staging-server/MSDeployAgentService           

En TeamCity, tengo parámetros llamados env.Configuration , env.ProjectName y env.DeployServiceUrl . El corredor MSBuild tiene la ruta del archivo de comstackción y los parámetros se pasan automágicamente (no es necesario especificarlos en los parámetros de línea de comando).

También puedes ejecutarlo desde la línea de comando:

 msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService 

Usando los perfiles de implementación presentados en VS 2012, puede publicar con la siguiente línea de comando:

 msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile= /p:Password= /p:VisualStudioVersion=11.0 

Para obtener más información sobre los parámetros, vea esto .

Encontré esa solución, funciona muy bien para mí:

 msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj 

La salsa secreta es el objective _WPPCopyWebApplication.

No conozco TeamCity, así que espero que esto funcione para usted.

La mejor manera que he encontrado para hacer esto es con MSDeploy.exe. Esto es parte del proyecto WebDeploy ejecutado por Microsoft. Puedes descargar los bits aquí .

Con WebDeploy, ejecutas la línea de comando

 msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp 

Esto hace lo mismo que el comando Publicar VS, copiando solo los bits necesarios a la carpeta de despliegue.

Con VisualStudio 2012 hay una forma de manejar subj sin perfiles de publicación. Puede pasar la carpeta de salida usando parámetros. Funciona tanto con ruta absoluta como relativa en el parámetro ‘publishUrl’. Puede usar VS100COMNTOOLS, sin embargo debe anular VisualStudioVersion para usar el destino ‘WebPublish’ de %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . Con VisualStudioVersion 10.0 esta secuencia de comandos tendrá éxito sin salidas 🙂

Actualización: Logré usar este método en un servidor de comstackción con Windows SDK 7.1 instalado (no Visual Studio 2010 y 2012 en una máquina). Pero tenía que seguir estos pasos para que funcione:

  1. Haga que Windows SDK 7.1 esté actualizado en una máquina usando Simmo answer ( https://stackoverflow.com/a/2907056/2164198 )
  2. Establecer clave de registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0 en “C: \ Archivos de progtwig \ Microsoft Visual Studio 10.0 \” (utilice su ruta de acceso según corresponda)
  3. Copiando la carpeta% ProgramFiles% \ MSBuild \ Microsoft \ VisualStudio \ v11.0 desde mi máquina reveladora para construir el servidor

Guión:

 set WORK_DIR=%~dp0 pushd %WORK_DIR% set OUTPUTS=%WORK_DIR%..\Outputs set CONFIG=%~1 if "%CONFIG%"=="" set CONFIG=Release set VSTOOLS="%VS100COMNTOOLS%" if %VSTOOLS%=="" set "PATH=%PATH%;%WINDIR%\Microsoft.NET\Framework\v4.0.30319" && goto skipvsinit call "%VSTOOLS:~1,-1%vsvars32.bat" if errorlevel 1 goto end :skipvsinit msbuild.exe Project.csproj /t:WebPublish /p:Configuration=%CONFIG% /p:VisualStudioVersion=11.0 /p:WebPublishMethod=FileSystem /p:publishUrl=%OUTPUTS%\Project if errorlevel 1 goto end :end popd exit /b %ERRORLEVEL% 

encontró dos soluciones diferentes que funcionaron de una manera ligeramente diferente:

1. Esta solución está inspirada en la respuesta de alexanderb [link] . Desafortunadamente, no funcionó para nosotros, algunos dll no se copiaron en el OutDir. Descubrimos que la sustitución de ResolveReferences por Build target resuelve el problema: ahora todos los archivos necesarios se copian en la ubicación de OutDir.

  msbuild / target: Build; _WPPCopyWebApplication / p: Configuration = Release; OutDir = C: \ Tmp \ myApp \ MyApp.csproj 

La desventaja de esta solución fue el hecho de que OutDir contenía no solo archivos para publicar.

2. La primera solución funciona bien pero no como esperábamos. Queríamos tener la funcionalidad de publicación tal como está en Visual Studio IDE, es decir, solo los archivos que deberían publicarse se copiarán en el directorio de Salida. Como ya se mencionó, la primera solución copia muchos más archivos en el OutDir: el sitio web de publicación se almacena en la _PublishedWebsites/{ProjectName} . El siguiente comando soluciona esto: solo los archivos para publicación se copiarán a la carpeta deseada. Así que ahora tiene un directorio que puede ser publicado directamente: en comparación con la primera solución, ahorrará algo de espacio en el disco duro.

  msbuild / target: Build; PipelinePreDeployCopyAllFilesToOneFolder / p: Configuration = Release; _PackageTempDir = C: \ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj 

AutoParameterizationWebConfigConnectionStrings=false parameter garantizará que las cadenas de conexión no se manejarán como artefactos especiales y se generarán correctamente. Para obtener más información, consulte el enlace .

Debes configurar tus ambientes

y hacer referencia a mi blog. (Lo siento fue coreano)

  • http://xyz37.blog.me/50124665657
  • http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7

     @ECHO OFF :: http://stackoverflow.com/questions/5598668/valid-parameters-for-msdeploy-via-msbuild ::-DeployOnBuild -True :: -False :: ::-DeployTarget -MsDeployPublish :: -Package :: ::-Configuration -Name of a valid solution configuration :: ::-CreatePackageOnPublish -True :: -False :: ::-DeployIisAppPath -/ :: ::-MsDeployServiceUrl -Location of MSDeploy installation you want to use :: ::-MsDeployPublishMethod -WMSVC (Web Management Service) :: -RemoteAgent :: ::-AllowUntrustedCertificate (used with self-signed SSL certificates) -True :: -False :: ::-UserName ::-Password SETLOCAL IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727" IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v3.5" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v3.5" IF EXIST "%SystemRoot%\Microsoft.NET\Framework\v4.0.30319" SET FXPath="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319" SET targetFile=:8172/MsDeploy.axd SET msDeploySite="" SET userName="WebDeploy" SET password=%USERNAME% SET platform=AnyCPU SET msbuild=%FXPath%\MSBuild.exe /MaxCpuCount:%NUMBER_OF_PROCESSORS% /clp:ShowCommandLine %MSBuild% %targetFile% /p:configuration=%configuration%;Platform=%platform% /p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=False /p:DeployIISAppPath=%msDeploySite% /p:MSDeployPublishMethod=WMSVC /p:MsDeployServiceUrl=%msDeployServiceUrl% /p:AllowUntrustedCertificate=True /p:UserName=%USERNAME% /p:Password=%password% /p:SkipExtraFilesOnServer=True /p:VisualStudioVersion=12.0 IF NOT "%ERRORLEVEL%"=="0" PAUSE ENDLOCAL 

Este es mi archivo por lotes

 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe C:\Projects\testPublish\testPublish.csproj /p:DeployOnBuild=true /property:Configuration=Release if exist "C:\PublishDirectory" rd /q /s "C:\PublishDirectory" C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory cd C:\PublishDirectory\bin del *.xml del *.pdb