Visual Studio 2010 dispose d'une commande Publier qui vous permet de publier votre projet d'application Web dans un emplacement de système de fichiers. J'aimerais faire cela sur mon serveur de génération TeamCity, je dois donc le faire avec le gestionnaire de solutions ou msbuild. J'ai essayé d'utiliser la cible Publier, mais je pense que cela pourrait être pour ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
En gros, je veux faire exactement ce que fait un projet de déploiement Web, mais sans le complément. J'en ai besoin pour compiler le WAP, supprimer tous les fichiers inutiles pour l'exécution, effectuer toute transformation web.config et copier le résultat à un emplacement spécifié.
Ma solution, d'après la réponse de Jeff Siver
<Target Name="Deploy">
<MSBuild Projects="$(SolutionFile)"
Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package"
ContinueOnError="false" />
<Exec Command=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
Je l’ai surtout travaillé sans un script msbuild personnalisé. Voici les paramètres de configuration de génération TeamCity pertinents:
Chemins des artefacts:% system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp Type de runner: MSBuild (Runner pour les fichiers MSBuild) Chemin du fichier de génération: MyProject\MyProject. csproj Répertoire de travail: identique au répertoire de commande Version MSBuild: Microsoft .NET Framework 4.0 MSBuild ToolsVersion: 4.0 Plate-forme d'exécution: x86 Cibles: Package Paramètres de ligne de commande pour MSBuild .exe: /p:Configuration=Debug
Cela compilera, conditionnera (avec la transformation web.config) et sauvegardera la sortie en tant qu’artefacts. La seule chose qui manque est la copie de la sortie vers un emplacement spécifié, mais cela pourrait être fait soit dans une autre configuration de génération TeamCity avec une dépendance d'artefact, soit avec un script msbuild.
Mettre à jour
Voici un script msbuild qui compilera, conditionnera (avec la transformation web.config) et copiera la sortie sur mon serveur de transfert.
<?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>
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é qu'il valait la peine de mettre à jour ma réponse avec mon script actuel qui utilise Web Deploy (également appelé 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>
Dans TeamCity, j'ai des paramètres nommés env.Configuration
, env.ProjectName
et env.DeployServiceUrl
. Le runner MSBuild a le chemin du fichier de construction et les paramètres sont passés automatiquement (vous n'avez pas besoin de les spécifier dans les paramètres de 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
À l'aide des 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=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
Pour plus d'informations sur les paramètres 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 fonctionnera pour vous.
Le meilleur moyen que j'ai trouvé de faire cela est avec 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 copiant uniquement les bits nécessaires dans le dossier de déploiement.
Avec VisualStudio 2012, il existe un moyen de gérer les sujets sans publier les profils. Vous pouvez transmettre le dossier de sortie à l'aide de paramètres. Il fonctionne avec les chemins 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 :)
Update: J'ai réussi à utiliser cette méthode sur un serveur de génération sur lequel seul le Kit de développement logiciel (SDK) Windows 7.1 est installé (pas de Visual Studio 2010 ni 2012 sur une machine). Mais je devais suivre ces étapes pour le faire fonctionner:
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 s’inspire de la réponse de alexanderb [link] . Malheureusement, cela n'a pas fonctionné pour nous - certaines dll n'ont pas été copiées dans OutDir. Nous avons découvert que le remplacement de ResolveReferences
par Build
cible 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 = Libération; OutDir = C:\Tmp\myApp\MyApp.csprojInconvénient de cette solution: OutDir ne contenait pas uniquement des fichiers à publier .
2. La première solution fonctionne bien mais pas comme prévu. Nous voulions que la fonctionnalité de publication soit la même que dans Visual Studio IDE - c'est-à-dire que seuls les fichiers devant être publiés seront copiés dans le répertoire de sortie. Comme cela a déjà été mentionné, la solution copie beaucoup plus de fichiers dans le répertoire OutDir - le site Web à publier 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é. Vous avez donc maintenant un répertoire qui peut être publié directement. En comparaison avec la première solution, vous économiserez de l’espace sur le disque dur .
msbuild/target: Build; PipelinePreDeployCopyAllFilesToOneFolder/p: Configuration = Version; _PackageTempDir = C:\Tmp\myApp \; AutoParameterizationWebConfigConnectionStrings = false MonApp.csprojLe paramètre
AutoParameterizationWebConfigConnectionStrings=false
garantit que les chaînes de connexion ne seront pas traitées comme des artefacts spéciaux et seront correctement générées - pour plus d'informations, voir link .Vous devez définir vos environnements
et référence mon blog. (désolé post était coréen)
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 -<Web Site Name>/<Folder>
::
::-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=<web site fullPath ie. .\trunk\WebServer\WebServer.csproj
SET configuration=Release
SET msDeployServiceUrl=https://<domain>:8172/MsDeploy.axd
SET msDeploySite="<WebSite name>"
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
C'est 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_compiler.exe -v / -p C:\Projects\testPublish\obj\Release\Package\PackageTmp -c C:\PublishDirectory
cd C:\PublishDirectory\bin
del *.xml
del *.pdb
Pour générer la sortie de publication, fournissez un paramètre supplémentaire.
c'est mon lot de travail
publish-my-website.bat
SET MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin"
SET PUBLISH_DIRECTORY="C:\MyWebsitePublished"
SET PROJECT="D:\Github\MyWebSite.csproj"
cd /d %MSBUILD_PATH%
MSBuild %PROJECT% /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=%PUBLISH_DIRECTORY%
Notez que j'ai installé Visual Studio sur le serveur pour pouvoir exécuter MsBuild.exe
car le MsBuild.exe
dans les dossiers .Net Framework ne fonctionne pas.