235 votes

Comment faire pour publier le site Web avec msbuild ?

Visual Studio 2010 a une Publier de commande qui vous permet de publier votre Projet d'Application Web à un emplacement du système de fichiers. J'aimerais faire cela sur mon TeamCity serveur de build, donc j'ai besoin de le faire avec la solution coureur ou msbuild. J'ai essayé d'utiliser le Publier cible, mais je pense que cela pourrait être pour de ClickOnce:

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

En gros, je veux faire exactement ce qu'est un projet de déploiement web, mais sans le complément. J'en ai besoin pour compiler le WAP, supprimer les fichiers inutiles pour l'exécution, effectuer un web.config transformations, et copie le résultat dans un emplacement spécifié.

Ma Solution, basée sur Jeff Siver réponse

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

143voto

jrummell Points 23718

J'ai eu la plupart du temps de travail sans un custom script msbuild. Voici les TeamCity construire des paramètres de configuration:

Artefact chemins: %système.teamcity.construire.workingDir%\Monprojet\obj\Debug\Package\PackageTmp 
Type de coureur: MSBuild (Runner pour MSBuild fichiers) 
Construire chemin d'accès du fichier: Monprojet\Monprojet.csproj 
Répertoire de travail: la même que la caisse répertoire 
MSBuild version: Microsoft .NET Framework 4.0 
MSBuild ToolsVersion: 4.0 
Exécution plate-forme: x86 
Objectifs: Package 
Paramètres de ligne de commande MSBuild.exe: /p:Configuration=Debug

Cela permettra de compiler, l'ensemble (avec web.config de transformation), et d'enregistrer le résultat en tant qu'objets. La seule chose qui manque est la copie de la sortie vers un emplacement spécifié, mais qui pourrait être fait soit dans un autre TeamCity de configuration de la compilation avec un artefact de dépendance ou avec un script msbuild.

Mise à jour

Voici un msbuild script de compilation, l'ensemble (avec web.config de transformation), et de copier la sortie de mon serveur de test

<?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 le SolutionName et ProjectName propriétés de la PropertyGroup balise et de les transmettre à msbuild.

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

Mise à jour 2

Étant donné que cette question n'en est toujours une bonne affaire de trafic, j'ai pensé qu'il valait la mise à jour de ma réponse avec mon script qui utilise le déploiement Web (également connu comme 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 les paramètres nommés env.Configuration, env.ProjectName et env.DeployServiceUrl. MSBuild coureur a le bâtir chemin d'accès au fichier et les paramètres sont transmis automatiquement (vous n'avez pas à 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

92voto

Chris Points 1646

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

Pour plus d’informations sur les paramètres, voir cela.

43voto

alexanderb Points 6553

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

La sauce secrète est la cible de _WPPCopyWebApplication.

29voto

Jeff Siver Points 4710

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

La meilleure façon que j’ai trouvé à faire c’est avec MSDeploy.exe. Cela fait partie du projet WebDeploy géré par Microsoft. Vous pouvez télécharger les bits ici.

Avec WebDeploy, vous exécutez la ligne de commande

Cela fait la même chose que la commande VS publier, copier uniquement les bits nécessaires vers le dossier de déploiement.

13voto

Ivan Samygin Points 1579

Avec VisualStudio 2012 il y a un moyen de gérer objet sans publier les profils. Vous pouvez transmettre le dossier de sortie à l'aide de paramètres. Il fonctionne à la fois absolue et relative chemin dans 'publishUrl paramètre. Vous pouvez utiliser VS100COMNTOOLS, cependant, vous devez remplacer VisualStudioVersion pour utiliser l'objectif 'WebPublish" de %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets. Avec VisualStudioVersion 10.0 ce script va réussir avec pas de sorties :)

Mise à jour: j'ai réussi à utiliser cette méthode sur un serveur de build avec juste Windows SDK 7.1 installé (pas de Visual Studio 2010 et 2012 sur une machine). Mais j'ai dû suivre ces étapes pour le faire fonctionner:

  1. Faire de Windows SDK 7.1 à jour sur un ordinateur à l'aide de Simmo réponse (http://stackoverflow.com/a/2907056/2164198)
  2. Réglage de la Clé de Registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7\10.0 "C:\Program Files\Microsoft Visual Studio 10.0\" (utilisez votre chemin, comme approprié)
  3. Copier le dossier %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0 à partir de mon ordinateur du développeur pour construire le serveur

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%

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X