Visual Studio 2010には、Webアプリケーションプロジェクトをファイルシステムの場所に発行できる[発行]コマンドがあります。 TeamCityビルドサーバーでこれを実行したいので、ソリューションランナーまたはmsbuildで実行する必要があります。パブリッシュターゲットを使用してみましたが、ClickOnceに適していると思います。
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
基本的には、Web展開プロジェクトとまったく同じことを行いたいのですが、アドインは使いません。 WAPをコンパイルし、実行に不要なファイルを削除し、 web.config変換 を実行し、指定された場所に出力をコピーするために必要です。
私の解決策、ジェフ・シヴァーの答えに基づいて
<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>
ほとんどの場合、カスタムmsbuildスクリプトなしで動作します。関連するTeamCityビルド構成設定は次のとおりです。
アーティファクトパス:%system.teamcity.build.workingDir%\ MyProject\obj\Debug\Package\PackageTmp ランナーのタイプ:MSBuild(MSBuildファイルのランナー) ビルドファイルパス:MyProject\MyProject.csproj 作業ディレクトリ:チェックアウトディレクトリと同じ MSBuildバージョン:Microsoft .NET Framework 4.0 MSBuild ToolsVersion:4.0 Run platform:x86 ターゲット:パッケージ コマンドラインパラメーターからMSBuild.exe:/p:Configuration=Debug
これにより、コンパイルされ、パッケージ化され(web.config変換を使用)、出力が成果物として保存されます。不足しているのは、指定された場所に出力をコピーすることだけですが、アーティファクト依存関係がある別のTeamCityビルド構成またはmsbuildスクリプトのいずれかで実行できます。
更新
これは、コンパイル、パッケージ(web.config変換を使用)、および出力をステージングサーバーにコピーするmsbuildスクリプトです。
<?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>
PropertyGroupタグからSolutionNameプロパティとProjectNameプロパティを削除して、msbuildに渡すこともできます。
msbuild build.xml /p:Configuration=Deploy;SolutionName=MySolution;ProjectName=MyProject
更新2
この質問は依然として大量のトラフィックを得るため、 Web Deploy (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>
TeamCityには、env.Configuration
、env.ProjectName
、env.DeployServiceUrl
という名前のパラメーターがあります。 MSBuildランナーにはビルドファイルのパスがあり、パラメーターは自動的に渡されます(コマンドラインパラメーターで指定する必要はありません)。
コマンドラインからも実行できます:
msbuild build.xml /p:Configuration=Staging;ProjectName=MyProject;DeployServiceUrl=http://staging-server/MSDeployAgentService
VS 2012で導入された展開プロファイルを使用して、次のコマンドラインで公開できます。
msbuild MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=<profile-name> /p:Password=<insert-password> /p:VisualStudioVersion=11.0
パラメーターの詳細については、 こちらをご覧ください 。
私はそのような解決策を思いつきました、私にとってはうまくいきます:
msbuild /t:ResolveReferences;_WPPCopyWebApplication /p:BuildingProject=true;OutDir=C:\Temp\build\ Test.csproj
秘密のソースは_WPPCopyWebApplicationターゲットです。
TeamCityがわからないので、これがあなたに役立つことを願っています。
これを行うために私が見つけた最良の方法は、MSDeploy.exeを使用することです。これは、Microsoftが実行するWebDeployプロジェクトの一部です。ビットをダウンロードできます こちら 。
WebDeployでは、コマンドラインを実行します
msdeploy.exe -verb:sync -source:contentPath=c:\webApp -dest:contentPath=c:\DeployedWebApp
これは、VS Publishコマンドと同じことを行い、必要なビットのみを展開フォルダーにコピーします。
VisualStudio 2012では、プロファイルを公開せずにsubjを処理する方法があります。パラメーターを使用して出力フォルダーを渡すことができます。 'publishUrl'パラメーターの絶対パスと相対パスの両方で機能します。 VS100COMNTOOLSを使用できますが、%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
のターゲット「WebPublish」を使用するにはVisualStudioVersionをオーバーライドする必要があります。 VisualStudioVersion 10.0では、このスクリプトは出力なしで成功します:)
更新:Windows SDK 7.1のみがインストールされたビルドサーバー(このマシンにはVisual Studio 2010および2012はありません)でこのメソッドを使用することができました。しかし、私はそれを機能させるために次の手順に従わなければなりませんでした:
スクリプト:
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%
環境を設定する必要があります
そして私のブログを参照してください。
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:\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つのパラメーターを提供します。 msbuild example.sln/p:publishprofile = profilename/p:deployonbuild = true/p:configuration = debug/or any
これは私の作業バッチです
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%
.Net FrameworkフォルダーのMsBuild.exe
が機能しないため、MsBuild.exe
を実行できるようにサーバーにVisual Studioをインストールしたことに注意してください。