asp.net - desktopbuildpackagelocation - ¿Cómo publicar web con msbuild?
msbuild zip package (9)
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 compilación TeamCity, por lo que necesito hacerlo con la solución runner o msbuild. Intenté usar el objetivo 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. Lo necesito para compilar el WAP, eliminar cualquier archivo innecesario para la ejecución, realizar cualquier transformación web.config y copiar el resultado en una ubicación específica.
Mi solución , basada en la respuesta de Jeff Siver.
<Target Name="Deploy">
<MSBuild Projects="$(SolutionFile)"
Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package"
ContinueOnError="false" />
<Exec Command=""$(ProjectPath)/obj/$(Configuration)/Package/$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
Con VisualStudio 2012 hay una manera de manejar subj sin publicar perfiles. Puede pasar la carpeta de salida utilizando 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, este script tendrá éxito sin salidas :)
Actualización: logré usar este método en un servidor de compilación con solo Windows SDK 7.1 instalado (sin Visual Studio 2010 y 2012 en una máquina). Pero tuve que seguir estos pasos para que funcione:
- Active Windows SDK 7.1 en una máquina con la respuesta de Simmo ( https://.com/a/2907056/2164198 )
- Configuración de la clave de registro HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / VisualStudio / SxS / VS7 / 10.0 en "C: / Archivos de programa / Microsoft Visual Studio 10.0 /" (use su ruta según corresponda)
- Copiando la carpeta% Archivos de programa% / MSBuild / Microsoft / VisualStudio / v11.0 de mi máquina de desarrollador al servidor de compilación
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%
Debes configurar tus entornos
- <Nombre del sitio web>
- <dominio>
y referencia a mi blog. (Lo siento post fue coreano)
- http://xyz37.blog.me/50124665657
http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7
@ECHO OFF :: http://.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 -<Web Site Name>/<Folder> :: ::-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=<web site fullPath ie. ./trunk/WebServer/WebServer.csproj SET configuration=Release SET msDeployServiceUrl=https://<domain>:8172/MsDeploy.axd SET msDeploySite="<WebSite name>" 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
Encontré dos soluciones diferentes que funcionaron de manera ligeramente diferente:
1. Esta solución está inspirada en la respuesta de alexanderb [link] . Desafortunadamente, no funcionó para nosotros, algunos archivos DLL no se copiaron en OutDir. Descubrimos que reemplazar ResolveReferences
con 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 no solo contenía 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 el IDE de Visual Studio, es decir, solo los archivos que deberían publicarse se copiarán en el directorio de salida. Como ya se ha mencionado, la primera solución copia muchos más archivos en OutDir: el sitio web para publicación se almacena en la _PublishedWebsites/{ProjectName}
. El siguiente comando resuelve esto: solo los archivos para publicación se copiarán en la carpeta deseada. Así que ahora tiene un directorio que puede publicarse 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
parámetro AutoParameterizationWebConfigConnectionStrings=false
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 link .
Este 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
Lo tengo trabajando principalmente sin un script msbuild personalizado. Aquí están los ajustes de configuración de compilación de TeamCity relevantes:
Artifact paths: %system.teamcity.build.workingDir%/MyProject/obj/Debug/Package/PackageTmp Type of runner: MSBuild (Runner for MSBuild files) Build file path: MyProject/MyProject.csproj Working directory: same as checkout directory MSBuild version: Microsoft .NET Framework 4.0 MSBuild ToolsVersion: 4.0 Run platform: x86 Targets: Package Command line parameters to MSBuild.exe: /p:Configuration=Debug
Esto compilará, empaquetará (con la transformación web.config) y guardará la salida como artefactos. Lo único que falta es copiar la salida en una ubicación específica, pero eso podría hacerse en otra configuración de compilación de TeamCity con una dependencia de artefactos o con un script msbuild.
Actualizar
Aquí hay una secuencia de comandos msbuild que compilará, empaquetará (con la transformación web.config), y copiará la salida a mi servidor de pruebas
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" ''$(Configuration)'' == '''' ">Release</Configuration>
<SolutionName>MySolution</SolutionName>
<SolutionFile>$(SolutionName).sln</SolutionFile>
<ProjectName>MyProject</ProjectName>
<ProjectFile>$(ProjectName)/$(ProjectName).csproj</ProjectFile>
</PropertyGroup>
<Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />
<Target Name="BuildPackage">
<MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="CopyOutput">
<ItemGroup>
<PackagedFiles Include="$(ProjectName)/obj/$(Configuration)/Package/PackageTmp/**/*.*"/>
</ItemGroup>
<Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->''//build02/wwwroot/$(ProjectName)/$(Configuration)/%(RecursiveDir)%(Filename)%(Extension)'')"/>
</Target>
</Project>
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 aún recibe una gran cantidad de tráfico, pensé que valía la pena actualizar mi respuesta con mi script actual que usa Web Deploy (también conocido como MSDeploy).
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" ''$(Configuration)'' == '''' ">Release</Configuration>
<ProjectFile Condition=" ''$(ProjectFile)'' == '''' ">$(ProjectName)/$(ProjectName).csproj</ProjectFile>
<DeployServiceUrl Condition=" ''$(DeployServiceUrl)'' == '''' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
</PropertyGroup>
<Target Name="VerifyProperties">
<!-- Verify that we have values for all required properties -->
<Error Condition=" ''$(ProjectName)'' == '''' " Text="ProjectName is required." />
</Target>
<Target Name="Build" DependsOnTargets="VerifyProperties">
<!-- Deploy using windows authentication -->
<MSBuild Projects="$(ProjectFile)"
Properties="Configuration=$(Configuration);
MvcBuildViews=False;
DeployOnBuild=true;
DeployTarget=MSDeployPublish;
CreatePackageOnPublish=True;
AllowUntrustedCertificate=True;
MSDeployPublishMethod=RemoteAgent;
MsDeployServiceUrl=$(DeployServiceUrl);
SkipExtraFilesOnServer=True;
UserName=;
Password=;"
ContinueOnError="false" />
</Target>
</Project>
En TeamCity, tengo parámetros llamados env.Configuration
, env.ProjectName
y env.DeployServiceUrl
. El corredor de MSBuild tiene la ruta del archivo de compilación y los parámetros se pasan automáticamente (no es necesario especificarlos en los parámetros de la línea de comandos).
También puedes ejecutarlo desde la línea de comando:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
No sé TeamCity, así que espero que esto pueda funcionar 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, ejecuta la línea de comandos
msdeploy.exe -verb:sync -source:contentPath=c:/webApp -dest:contentPath=c:/DeployedWebApp
Esto hace lo mismo que el comando VS Publish, copiando solo los bits necesarios a la carpeta de implementación.
Se me ocurrió tal solución, funciona muy bien para mí:
msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:/Temp/build/ Test.csproj
La salsa secreta es _WPPCopyWebApplication target.
Usando los perfiles de implementación introducidos en VS 2012, puede publicar con la siguiente línea de comando:
msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
Para más información sobre los parámetros vea esto .
este es mi lote de trabajo
publish-my-website.bat
SET MSBUILD_PATH="C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/MSBuild/15.0/Bin"
SET PUBLISH_DIRECTORY="C:/MyWebsitePublished"
SET PROJECT="D:/Github/MyWebSite.csproj"
cd /d %MSBUILD_PATH%
MSBuild %PROJECT% /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%
Tenga en cuenta que instalé Visual Studio en el servidor para poder ejecutar MsBuild.exe
porque MsBuild.exe
en las carpetas de .Net Framework no funciona.