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=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
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
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 .
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.
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.
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:
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%
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 .
Sie müssen Ihre Umgebung einstellen
und verweise auf meinen Blog (leider war der Beitrag auf Koreanisch)
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
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
Geben Sie für die Generierung der Publish-Ausgabe einen weiteren Parameter an ..__
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.