Comment publier du Web avec msbuild?

Visual Studio 2010 comporte une commande Publier qui vous permet de publier votre projet d’application Web sur un emplacement de système de fichiers. Je voudrais le faire sur mon serveur de construction TeamCity, je dois donc le faire avec le programme runner ou msbuild. J’ai essayé d’utiliser la cible Publish, mais je pense que cela pourrait être pour ClickOnce:

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

Je veux essentiellement faire exactement ce que fait un projet de déploiement Web, mais sans le complément. J’en ai besoin pour comstackr le WAP, supprimer tous les fichiers inutiles pour l’exécution, effectuer toutes les transformations web.config et copier la sortie vers un emplacement spécifié.

Ma solution , basée sur la réponse de Jeff Siver

     

Je l’ai surtout fait fonctionner sans un script msbuild personnalisé. Voici les parameters de configuration de construction TeamCity pertinents:

 Chemins d'artefact:% system.teamcity.build.workingDir% \ MyProject \ obj \ Debug \ Package \ PackageTmp 
 Type de runner: MSBuild (Runner pour fichiers MSBuild) 
 Construire le chemin du fichier: MyProject \ MyProject.csproj 
 Répertoire de travail: identique au répertoire de vérification 
 Version MSBuild: Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion: 4.0 
 Exécuter la plateforme: x86 
 Cibles: Package 
 Paramètres de ligne de commande pour MSBuild.exe: / p: Configuration = Debug

Cela comstackra, comstackra (avec la transformation web.config) et sauvegardera la sortie sous forme d’artefacts. La seule chose qui manque est la copie de la sortie vers un emplacement spécifié, mais cela peut être fait dans une autre configuration de construction TeamCity avec une dépendance d’artefact ou avec un script msbuild.

Mettre à jour

Voici un script msbuild qui comstackra, comstackra (avec la transformation web.config) et copiera la sortie sur mon serveur de transfert

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

Vous pouvez également supprimer les propriétés SolutionName et ProjectName de la balise PropertyGroup et les transmettre à msbuild.

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

Mise à jour 2

Étant donné que cette question génère encore beaucoup de trafic, j’ai pensé que cela valait la peine de mettre à jour ma réponse avec mon script actuel qui utilise Web Deploy (également appelé MSDeploy).

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

Dans TeamCity, j’ai des parameters nommés env.Configuration , env.ProjectName et env.DeployServiceUrl . Le runner MSBuild a le chemin du fichier de compilation et les parameters sont transmis automatiquement (vous n’avez pas besoin de les spécifier dans les parameters de la ligne de commande).

Vous pouvez également l’exécuter à partir de la ligne de commande:

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

En utilisant les profils de déploiement introduits dans VS 2012, vous pouvez publier avec la ligne de commande suivante:

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

Pour plus d’informations sur les parameters, voir ceci .

Je suis venu avec une telle solution, fonctionne très bien pour moi:

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

La sauce secrète est la cible _WPPCopyWebApplication.

Je ne connais pas TeamCity, alors j’espère que cela peut fonctionner pour vous.

La meilleure façon de le faire est d’utiliser MSDeploy.exe. Cela fait partie du projet WebDeploy exécuté par Microsoft. Vous pouvez télécharger les bits ici .

Avec WebDeploy, vous exécutez la ligne de commande

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

Cela fait la même chose que la commande VS Publish, en ne copiant que les bits nécessaires dans le dossier de déploiement.

Avec VisualStudio 2012, il existe un moyen de gérer les profils sans publication. Vous pouvez transmettre le dossier de sortie à l’aide de parameters. Il fonctionne à la fois avec un chemin absolu et relatif dans le paramètre ‘publishUrl’. Vous pouvez utiliser VS100COMNTOOLS, mais vous devez remplacer VisualStudioVersion pour utiliser la cible «WebPublish» à partir de %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets . Avec VisualStudioVersion 10.0, ce script réussira sans sorties 🙂

Mise à jour: j’ai réussi à utiliser cette méthode sur un serveur de compilation sur lequel Windows SDK 7.1 est installé (pas de Visual Studio 2010 et 2012 sur une machine). Mais je devais suivre ces étapes pour que ça marche:

  1. Rendre Windows SDK 7.1 actuel sur une machine en utilisant Simmo answer ( https://stackoverflow.com/a/2907056/2164198 )
  2. Définition de la clé de Registre HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ SxS \ VS7 \ 10.0 sur “C: \ Program Files \ Microsoft Visual Studio 10.0 \” (utilisez votre chemin d’access approprié)
  3. Copier le dossier% ProgramFiles% \ MSBuild \ Microsoft \ VisualStudio \ v11.0 à partir de mon ordinateur de développeur pour créer le serveur

Scénario:

 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% 

trouvé deux solutions différentes qui fonctionnaient de manière légèrement différente:

1. Cette solution est inspirée de la réponse de alexanderb [link] . Malheureusement, cela n’a pas fonctionné pour nous – certaines DLL n’ont pas été copiées sur OutDir. Nous avons découvert que le remplacement de ResolveReferences par la cible Build résout le problème. Désormais, tous les fichiers nécessaires sont copiés dans l’emplacement OutDir.

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

Le désavantage de cette solution était que OutDir contenait non seulement des fichiers à publier.

2. La première solution fonctionne bien mais pas comme prévu. Nous voulions avoir la fonctionnalité de publication telle qu’elle est dans Visual Studio IDE – c’est-à-dire que seuls les fichiers à publier seront copiés dans le répertoire de sortie. Comme il a déjà été mentionné, la première solution copie beaucoup plus de fichiers dans le OutDir – le site Web pour la publication est ensuite stocké dans le sous-dossier _PublishedWebsites/{ProjectName} . La commande suivante résout ce problème – seuls les fichiers à publier seront copiés dans le dossier souhaité. Donc, maintenant vous avez un répertoire qui peut être directement publié – en comparaison avec la première solution, vous économiserez de l’espace sur le disque dur.

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

AutoParameterizationWebConfigConnectionSsortingngs=false paramètre AutoParameterizationWebConfigConnectionSsortingngs=false garantira que les chaînes de connexion ne seront pas traitées comme des artefacts spéciaux et seront générées correctement – pour plus d’informations, voir le lien .

Vous devez définir vos environnements

et référence mon blog. (désolé poste était coréen)

  • 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 certificatees) -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 

Ceci mon fichier 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_comstackr.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory cd C:\PublishDirectory\bin del *.xml del *.pdb