216 votos

¿Cómo publicar la web con msbuild?

Visual Studio 2010 tiene un comando de publicación 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 construcción TeamCity, así que necesito hacerlo con el corredor de soluciones o msbuild. Traté de 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 despliegue web, pero sin el complemento. Necesito que compile el WAP, elimine cualquier archivo innecesario para la ejecución, realice cualquier transformaciones web.config y copiar la salida en un lugar determinado.

Mi solución , basado 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>

136voto

jrummell Puntos 23718

Conseguí que funcionara mayormente sin un msbuild personalizado script. Aquí están los ajustes de configuración de construcció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 a una ubicación especificada, pero eso podría hacerse en otra configuración de construcción de TeamCity con una dependencia de artefactos o con un msbuild script.

Actualización

Aquí hay un msbuild script que compilará, empaquetará (con la transformación web.config), y copiará la salida a mi servidor de staging

<?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

Como esta pregunta sigue recibiendo una buena cantidad de tráfico, pensé que valía la pena actualizar mi respuesta con mi actual script que utiliza Despliegue web (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 denominados env.Configuration , env.ProjectName y env.DeployServiceUrl . El corredor de MSBuild tiene la ruta del archivo de construcción y los parámetros se pasan automáticamente (no tiene que especificarlos en los parámetros de la línea de comandos).

También puede ejecutarlo desde la línea de comandos:

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

84voto

Chris Puntos 1646

Utilizando los perfiles de despliegue introducidos en VS 2012, puede publicar con la siguiente línea de comandos:

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 ver esto .

38voto

alexanderb Puntos 6553

Se me ocurrió esa solución, me funciona muy bien:

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

La salsa secreta es el objetivo _WPPCopyWebApplication.

27voto

Jeff Siver Puntos 4710

No conozco TeamCity así que espero que esto te pueda servir.

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

Con WebDeploy, se 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 sólo lo necesario a la carpeta de despliegue.

13voto

Ivan Samygin Puntos 1579

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'. Usted puede utilizar VS100COMNTOOLS, sin embargo usted necesita anular VisualStudioVersion para utilizar el objetivo 'WebPublish' de %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . Con VisualStudioVersion 10.0 este script tendrá éxito sin salidas :)

Actualización: He conseguido utilizar este método en un servidor de compilación con sólo Windows SDK 7.1 instalado (sin Visual Studio 2010 y 2012 en una máquina). Pero he tenido que seguir estos pasos para que funcione:

  1. Haga que el SDK 7.1 de Windows esté actualizado en una máquina utilizando la respuesta de Simmo ( http://stackoverflow.com/a/2907056/2164198 )
  2. Configuración de la clave de registro HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\VisualStudio\SxS\VS7\10.0 a " C:\Program Archivos \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 de desarrollo al servidor de construcción

script:

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%

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X