¿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 compilación TeamCity, por lo que necesito hacerlo con el ejecutor de soluciones o msbuild. Intenté usar el objetivo Publicar, 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 los archivos innecesarios 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>
Lo hice funcionar principalmente sin un script msbuild personalizado. Aquí están los ajustes de configuración de compilación relevantes de TeamCity:
Rutas de artefactos: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp Tipo de corredor: MSBuild (Runner para archivos MSBuild) Ruta del archivo de compilación: MyProject\MyProject.csproj Directorio de trabajo: igual que el directorio de pago Versión de MSBuild: Microsoft .NET Framework 4.0 Herramientas de MSBuildVersión: 4.0 Plataforma de ejecución: x86 Objetivos: Paquete Parámetros de la línea de comando para MSBuild.exe: /p:Configuration=Debug
Esto compilará, empaquetará (con transformación web.config) y guardará el resultado como artefactos. Lo único que falta es copiar el resultado en una ubicación específica, pero eso se puede hacer en otra configuración de compilación de TeamCity con una dependencia de artefacto o con un script msbuild.
Actualizar
Aquí hay un script msbuild que compilará, empaquetará (con transformación web.config) y copiará el resultado en mi servidor de prueba.
<?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 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).
<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
y env.ProjectName
. env.DeployServiceUrl
El ejecutor 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
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 obtener más información sobre los parámetros, consulte esto .
Los valores del /p:VisualStudioVersion
parámetro dependen de su versión de Visual Studio. Wikipedia tiene una tabla de lanzamientos de Visual Studio y sus versiones .
Se me ocurrió 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 objetivo _WPPCopyWebApplication.
No conozco TeamCity, así que espero que esto pueda funcionar para ti.
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 comando
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.