wake-up-neo.com

Wie publiziere ich das Web mit msbuild?

Visual Studio 2010 verfügt über einen Veröffentlichungsbefehl, mit dem Sie Ihr Webanwendungsprojekt an einem Dateisystemspeicherort veröffentlichen können. Ich möchte dies auf meinem TeamCity-Build-Server tun, also muss ich es mit dem Solution Runner oder mit msbuild tun. Ich habe versucht, das Publish-Ziel zu verwenden, aber ich denke, das könnte für ClickOnce sein:

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

Grundsätzlich möchte ich genau das tun, was ein Webbereitstellungsprojekt macht, aber ohne das Add-In. Ich brauche es, um den WAP zu kompilieren, alle Dateien zu entfernen, die zur Ausführung nicht benötigt werden, alle web.config-Umwandlungen durchzuführen und die Ausgabe an einen angegebenen Ort zu kopieren.

My Solution, basierend auf Jeff Sivers Antwort

<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

Ich bekam es meistens ohne ein benutzerdefiniertes msbuild-Skript. Hier sind die relevanten TeamCity Build-Konfigurationseinstellungen:

 Artefaktpfade:% system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp 
 Typ des Läufers: MSBuild (Läufer für MSBuild-Dateien) 
 Dateipfad erstellen: MyProject\MyProject. csproj 
 Arbeitsverzeichnis: Entspricht dem Checkout-Verzeichnis 
 MSBuild-Version: Microsoft .NET Framework 4.0 
 MSBuild ToolsVersion: 4.0 
 Ausführen der Plattform: x86 
 Ziele: Paket 
 Befehlszeilenparameter für MSBuild .exe: /p:Configuration=Debug

Dies wird kompiliert, gepackt (mit der Umwandlung von web.config) und die Ausgabe als Artefakte gespeichert. Das einzige, was noch fehlt, ist das Kopieren der Ausgabe an einen angegebenen Ort. Dies kann jedoch entweder in einer anderen TeamCity-Build-Konfiguration mit einer Artefaktabhängigkeit oder mit einem msbuild-Skript erfolgen.

Update

Hier ist ein msbuild-Skript, das kompiliert, verpackt (mit der Umwandlung web.config) und die Ausgabe auf meinen Staging-Server kopiert

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

Sie können auch die Eigenschaften SolutionName und ProjectName aus dem PropertyGroup-Tag entfernen und an msbuild übergeben.

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

Update 2

Da diese Frage immer noch sehr viel Verkehr bekommt, hielt ich es für sinnvoll, meine Antwort mit meinem aktuellen Skript zu aktualisieren, das Web Deploy (auch als MSDeploy bezeichnet) verwendet.

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

In TeamCity habe ich Parameter namens env.Configuration, env.ProjectName und env.DeployServiceUrl. Der MSBuild-Runner verfügt über den Build-Dateipfad und die Parameter werden automatisch übergeben (Sie müssen sie nicht in Befehlszeilenparametern angeben).

Sie können es auch von der Befehlszeile aus ausführen:

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

Mit den in VS 2012 eingeführten Implementierungsprofilen können Sie mit der folgenden Befehlszeile veröffentlichen:

msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0

Weitere Informationen zu den Parametern siehe dieses .

74
Chris

Ich habe eine solche Lösung gefunden, die für mich großartig ist:

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

Die geheime Sauce ist _WPPCopyWebApplication target.

36

Ich kenne TeamCity nicht, also hoffe ich, dass dies für Sie funktionieren kann.

Der beste Weg, den ich gefunden habe, ist MSDeploy.exe. Dies ist Teil des von Microsoft ausgeführten WebDeploy-Projekts. Sie können die Bits hier herunterladen. 

Mit WebDeploy führen Sie die Befehlszeile aus

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

Dies hat dieselbe Funktion wie der VS-Publish-Befehl, wobei nur die erforderlichen Bits in den Implementierungsordner kopiert werden.

26
Jeff Siver

Mit VisualStudio 2012 gibt es eine Möglichkeit, Subj ohne Veröffentlichungsprofile zu behandeln. Sie können den Ausgabeordner mithilfe von Parametern übergeben. Es funktioniert sowohl mit dem absoluten als auch mit dem relativen Pfad im Parameter 'publishUrl'. Sie können VS100COMNTOOLS verwenden. Sie müssen jedoch VisualStudioVersion überschreiben, um das Ziel 'WebPublish' von %ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets zu verwenden. Mit VisualStudioVersion 10.0 wird dieses Skript ohne Ausgaben erfolgreich sein :)

Update: Ich habe es geschafft, diese Methode auf einem Build-Server zu verwenden, auf dem nur Windows SDK 7.1 installiert ist (keine Visual Studio 2010 und 2012 auf einem Computer). Aber ich musste diese Schritte befolgen, damit es funktioniert:

  1. Windows SDK 7.1 auf einem Computer unter Verwendung der Simmo-Antwort aktuell machen ( https://stackoverflow.com/a/2907056/2164198 )
  2. Festlegen des Registrierungsschlüssels HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7\10.0 auf "C:\Programme\Microsoft Visual Studio 10.0 \" (verwenden Sie ggf. den Pfad)
  3. Ordner% ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0 von meinem Entwicklercomputer zum Erstellen des Servers kopiert

Skript:

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

fand zwei verschiedene Lösungen, die auf unterschiedliche Weise funktionierten:

1. Diese Lösung ist inspiriert von der Antwort von alexanderb [link] . Leider hat es für uns nicht funktioniert - einige DLLs wurden nicht in das OutDir kopiert. Wir haben herausgefunden, dass das Ersetzen von ResolveReferences durch Build target das Problem löst - jetzt werden alle erforderlichen Dateien in den OutDir-Speicherort kopiert .

_PublishedWebsites/{ProjectName}-Unterordner gespeichert. Der folgende Befehl löst dieses Problem: Nur die zu veröffentlichenden Dateien werden in den gewünschten Ordner kopiert. Jetzt haben Sie ein Verzeichnis, das direkt veröffentlicht werden kann - im Vergleich zur ersten Lösung sparen Sie etwas Speicherplatz auf der Festplatte .

AutoParameterizationWebConfigConnectionStrings=false garantiert, dass Verbindungszeichenfolgen nicht als spezielle Artefakte behandelt und korrekt generiert werden. Weitere Informationen finden Sie unter link .

10
Pavel Cermak

Sie müssen Ihre Umgebung einstellen

  • <Name der Website>
  • <Domäne>

und verweise auf meinen Blog (leider war der Beitrag auf Koreanisch)

  • 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

Das ist meine Batchdatei

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

Geben Sie für die Generierung der Publish-Ausgabe einen weiteren Parameter an ..__

0

das ist meine Arbeitscharge

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%

Beachten Sie, dass ich Visual Studio auf dem Server installiert habe, um MsBuild.exe ausführen zu können, da MsBuild.exe in den .Net Framework-Ordnern nicht funktioniert.

0
Alper Ebicoglu