Come pubblicare Web con msbuild?

Visual Studio 2010 ha un comando Pubblica che consente di pubblicare il progetto di applicazione Web in un percorso del file system. Mi piacerebbe farlo sul mio server di sviluppo TeamCity, quindi ho bisogno di farlo con la soluzione runner o msbuild. Ho provato a utilizzare il target Publish, ma penso che potrebbe essere per ClickOnce:

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

Fondamentalmente voglio fare esattamente quello che fa un progetto di implementazione web, ma senza il componente aggiuntivo. Mi serve per compilare il WAP, rimuovere i file inutili per l’esecuzione, eseguire eventuali trasformazioni di web.config e copiare l’output in una posizione specificata.

La mia soluzione , basata sulla risposta di Jeff Siver

     

Ho funzionato principalmente senza uno script msbuild personalizzato. Ecco le impostazioni di configurazione build di TeamCity rilevanti:

 Percorsi artefatto:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp 
 Tipo di corridore: MSBuild (Runner per i file MSBuild) 
 Costruisci il percorso del file: MyProject \ MyProject.csproj 
 Directory di lavoro: uguale alla directory di checkout 
 Versione MSBuild: Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion: 4.0 
 Esegui piattaforma: x86 
 Obiettivi: pacchetto 
 Parametri della riga di comando in MSBuild.exe: / p: Configuration = Debug

Questo verrà compilato, pacchetto (con trasformazione web.config) e salvato l’output come artefatti. L’unica cosa che manca è copiare l’output in una posizione specificata, ma ciò potrebbe essere fatto in un’altra configurazione di build di TeamCity con una dipendenza da artefatto o con uno script di msbuild.

Aggiornare

Ecco uno script msbuild che compilerà, pacchetto (con trasformazione web.config) e copia l’output sul mio server di staging

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

È anche ansible rimuovere le proprietà SolutionName e ProjectName dal tag PropertyGroup e passarle a msbuild.

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

Aggiornamento 2

Poiché questa domanda riceve ancora molto traffico, ho pensato che valesse la pena di aggiornare la mia risposta con il mio script corrente che utilizza Web Deploy (noto anche come MSDeploy).

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

In TeamCity, ho parametri denominati env.Configuration , env.ProjectName e env.DeployServiceUrl . Il runner MSBuild ha il percorso del file build e i parametri vengono passati automaticamente (non è necessario specificarli nei parametri della riga di comando).

Puoi anche eseguirlo dalla riga di comando:

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

Utilizzando i profili di distribuzione introdotti in VS 2012, è ansible pubblicare con la seguente riga di comando:

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

Per maggiori informazioni sui parametri vedere questo .

Ho trovato una soluzione del genere, funziona alla grande per me:

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

La salsa segreta è _WPPCopyWebApplication target.

Non conosco TeamCity quindi spero che questo possa funzionare per voi.

Il modo migliore che ho trovato per farlo è con MSDeploy.exe. Questo fa parte del progetto WebDeploy eseguito da Microsoft. Puoi scaricare i pezzi qui .

Con WebDeploy, si esegue la riga di comando

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

Ciò equivale al comando VS Publish, che copia solo i bit necessari per la cartella di distribuzione.

Con VisualStudio 2012 esiste un modo per gestire subj senza pubblicare profili. È ansible passare la cartella di output utilizzando i parametri. Funziona sia con il percorso assoluto che relativo nel parametro ‘publishUrl’. È ansible utilizzare VS100COMNTOOLS, tuttavia è necessario eseguire l’override di VisualStudioVersion per utilizzare la destinazione “WebPublish” da %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . Con VisualStudioVersion 10.0 questo script riuscirà senza output 🙂

Aggiornamento: sono riuscito a utilizzare questo metodo su un build server con installato solo Windows SDK 7.1 (nessun Visual Studio 2010 e 2012 su una macchina). Ma ho dovuto seguire questi passaggi per farlo funzionare:

  1. Rendi Windows SDK 7.1 attuale su una macchina usando la risposta Simmo ( https://stackoverflow.com/a/2907056/2164198 )
  2. Impostazione della chiave di registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0 in “C: \ Programmi \ Microsoft Visual Studio 10.0 \” (utilizzare il percorso appropriato)
  3. Copia della cartella% ProgramFiles% \ MSBuild \ Microsoft \ VisualStudio \ v11.0 dal mio sviluppatore per creare un server

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% 

trovato due soluzioni differenti che hanno funzionato in modo leggermente diverso:

1. Questa soluzione è ispirata alla risposta di alexanderb [collegamento] . Sfortunatamente non ha funzionato per noi – alcune dll non sono state copiate nell’OutDir. Abbiamo scoperto che la sostituzione di ResolveReferences con Build target risolve il problema: ora tutti i file necessari vengono copiati nella posizione OutDir.

  msbuild / target: Build; _WPPCopyWebApplication / p: Configuration = Release; OutDir = C: \ Tmp \ myApp \ MyApp.csproj 

Lo svantaggio di questa soluzione era il fatto che OutDir conteneva non solo i file per la pubblicazione.

2. La prima soluzione funziona bene ma non come ci aspettavamo. Volevamo avere la funzionalità di pubblicazione così come è in Visual Studio IDE, ovvero solo i file che dovrebbero essere pubblicati verranno copiati nella directory Output. Come già accennato, la prima soluzione copia molti più file nell’OutDir – il sito Web per la pubblicazione viene quindi archiviato nella _PublishedWebsites/{ProjectName} . Il seguente comando risolve questo problema: solo i file per la pubblicazione verranno copiati nella cartella desiderata. Così ora hai una directory che può essere pubblicata direttamente – rispetto alla prima soluzione risparmierai spazio sul disco rigido.

  msbuild / target: Build; PipelinePreDeployCopyAllFilesToOneFolder / p: Configuration = Release; _PackageTempDir = C: \ Tmp \ myApp \; AutoParameterizationWebConfigConnectionStrings = false MyApp.csproj 

AutoParameterizationWebConfigConnectionStrings=false parameter garantirà che le stringhe di connessione non saranno gestite come artefatti speciali e verranno generate correttamente – per maggiori informazioni vedi link .

Devi impostare i tuoi ambienti

e fai riferimento al mio blog. (mi spiace post è stato 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 

Questo è il mio file batch

 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