¿Cómo publicar web con msbuild?

Resuelto jrummell asked hace 54 años • 13 respuestas

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="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
          ContinueOnError="false" />
</Target>
jrummell avatar Jan 01 '70 08:01 jrummell
Aceptado

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.Configurationy env.ProjectName. env.DeployServiceUrlEl 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
jrummell avatar Jun 23 '2010 02:06 jrummell

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:VisualStudioVersionparámetro dependen de su versión de Visual Studio. Wikipedia tiene una tabla de lanzamientos de Visual Studio y sus versiones .

Chris avatar Jan 09 '2013 10:01 Chris

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.

Alexander Beletsky avatar Jul 20 '2011 15:07 Alexander Beletsky

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.

Jeff Siver avatar Jun 23 '2010 13:06 Jeff Siver