Como publicar Web com msbuild?

O Visual Studio 2010 possui um comando Publicar que permite publicar seu Projeto de Aplicativo da Web em um local do sistema de arquivos. Eu gostaria de fazer isso no meu servidor de compilation TeamCity, então eu preciso fazê-lo com o runner de solução ou msbuild. Eu tentei usar o destino Publish, mas acho que pode ser para ClickOnce:

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

Eu basicamente quero fazer exatamente o que um projeto de implantação da Web faz, mas sem o add-in. Eu preciso disso para compilar o WAP, remover quaisquer arquivos desnecessários para execução, executar qualquer transformação web.config e copiar a saída para um local especificado.

Minha solução , com base na resposta de Jeff Siver

     

Eu consegui trabalhar principalmente sem um script msbuild personalizado. Aqui estão as configurações relevantes da configuração do TeamCity:

 Caminhos de artefatos:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp 
 Tipo de corredor: MSBuild (Runner for MSBuild files) 
 Criar caminho do arquivo: MyProject \ MyProject.csproj 
 Diretório de trabalho: o mesmo que o diretório de checkout 
 Versão do MSBuild: Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion: 4.0 
 Plataforma de execução: x86 
 Alvos: Pacote 
 parameters de linha de comando para MSBuild.exe: / p: Configuration = Debug

Isso compilará, empacotará (com a transformação web.config) e salvará a saída como artefatos. A única coisa que falta é copiar a saída para um local especificado, mas isso poderia ser feito em outra configuração de compilation do TeamCity com uma dependência de artefato ou com um script msbuild.

Atualizar

Aqui está um script msbuild que irá compilar, empacotar (com a transformação web.config) e copiar a saída para o meu servidor de temporariedade

 < ?xml version="1.0" encoding="utf-8" ?>   Release MySolution $(SolutionName).sln MyProject $(ProjectName)\$(ProjectName).csproj              

Você também pode remover as propriedades SolutionName e ProjectName da tag PropertyGroup e passá-las para msbuild.

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

Atualização 2

Como essa questão ainda recebe bastante tráfego, achei que valeria a pena atualizar minha resposta com meu script atual que usa o Web Deploy (também conhecido como MSDeploy).

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

No TeamCity, eu tenho parâmetros chamados env.Configuration , env.ProjectName e env.DeployServiceUrl . O executável do MSBuild possui o caminho do arquivo de construção e os parâmetros são passados ​​automaticamente (você não precisa especificá-los nos parâmetros da linha de comando).

Você também pode executá-lo a partir da linha de comando:

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

Usando os perfis de implementação introduzidos no VS 2012, você pode publicar com a seguinte linha de comando:

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

Para mais informações sobre os parâmetros, veja isto .

Eu vim com essa solução, funciona muito bem para mim:

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

O molho secreto é o destino _WPPCopyWebApplication.

Eu não conheço o TeamCity, então espero que isso funcione para você.

A melhor maneira que encontrei para fazer isso é com o MSDeploy.exe. Isso faz parte do projeto WebDeploy executado pela Microsoft. Você pode baixar os bits aqui .

Com o WebDeploy, você executa a linha de comando

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

Isso faz o mesmo que o comando VS Publish, copiando apenas os bits necessários para a pasta de implantação.

Com o VisualStudio 2012, existe uma maneira de manipular subj sem publicar perfis. Você pode passar a pasta de saída usando parâmetros. Funciona tanto com o caminho absoluto quanto relativo no parâmetro ‘publishUrl’. Você pode usar VS100COMNTOOLS, no entanto, é necessário replace o VisualStudioVersion para usar o destino ‘WebPublish’ em %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . Com VisualStudioVersion 10.0 este script terá sucesso sem saídas 🙂

Atualização: Consegui usar esse método em um servidor de compilation com apenas o Windows SDK 7.1 instalado (sem o Visual Studio 2010 e 2012 em uma máquina). Mas eu tive que seguir estes passos para fazer funcionar:

  1. Tornar o Windows SDK 7.1 atualizado em uma máquina usando a resposta Simmo ( https://stackoverflow.com/a/2907056/2164198 )
  2. Definindo a chave de registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0 para “C: \ Arquivos de Programas \ Microsoft Visual Studio 10.0 \” (use seu caminho conforme apropriado)
  3. Copiando a pasta% ProgramFiles% \ MSBuild \ Microsoft \ VisualStudio \ v11.0 da minha máquina de desenvolvedor para criar o servidor

Roteiro:

 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% 

encontrei duas soluções diferentes que funcionaram de maneira ligeiramente diferente:

1. Esta solução é inspirada na resposta de alexanderb [link] . Infelizmente, não funcionou para nós – algumas DLLs não foram copiadas para o OutDir. Descobrimos que replace ResolveReferences pelo Build resolve o problema – agora todos os arquivos necessários são copiados para o local do OutDir.

  msbuild / target: Build; _WPPCopyWebApplication / p: Configuração = Release; OutDir = C: \ Tmp \ myApp \ MyApp.csproj 

A desvantagem dessa solução era o fato de que o OutDir continha não apenas arquivos para publicação.

2. A primeira solução funciona bem, mas não como esperávamos. Queríamos ter a funcionalidade de publicação como está no Visual Studio IDE – ou seja, somente os arquivos que devem ser publicados serão copiados para o diretório Output. Como já foi mencionado, a primeira solução copia muito mais arquivos para o OutDir – o site para publicação é então armazenado na _PublishedWebsites/{ProjectName} . O seguinte comando resolve isso – apenas os arquivos para publicação serão copiados para a pasta desejada. Então agora você tem diretório que pode ser publicado diretamente – em comparação com a primeira solução você vai economizar algum espaço no disco rígido.

  msbuild / target: Construção; PipelinePreDeployCopyAllFilesToOneFolder / p: Configuração = Release; _PackageTempDir = C: \ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj 

AutoParameterizationWebConfigConnectionStrings=false parâmetro AutoParameterizationWebConfigConnectionStrings=false garantirá que as strings de conexão não serão tratadas como artefatos especiais e serão geradas corretamente – para obter mais informações, consulte o link .

Você deve definir seus ambientes

e referencie meu blog (desculpe post foi 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 meu arquivo de lote

 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