web-dev-qa-db-fra.com

Comment publier sur le Web avec msbuild?

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="&quot;$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd&quot; /y /m:$(DeployServer) -enableRule:DoNotDeleteRule" 
          ContinueOnError="false" />
</Target>
203
jrummell

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
133
jrummell

À 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 .

74
Chris

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.

36
Alexander Beletsky

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.

26
Jeff Siver

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:

  1. Rendre Windows SDK 7.1 actuel sur une machine 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:\Programmes\Microsoft Visual Studio 10.0 \" (utilisez le chemin approprié)
  3. Copie du dossier% ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0 à partir de la machine de développement 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%
13
Ivan Samygin

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.csproj
Inconvé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.csproj
Le 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 .

10
Pavel Cermak

Vous devez définir vos environnements

  • <Nom du site>
  • <domaine>

et référence mon blog. (désolé post é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 -<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
    
3
Kim Ki Won

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
1
Alim İŞÇİ

Pour générer la sortie de publication, fournissez un paramètre supplémentaire.

0
Yashwant Mahawar

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.

0
Alper Ebicoglu