Asp.net
如何使用 msbuild 發佈網頁?
Visual Studio 2010 有一個發布命令,允許您將 Web 應用程序項目發佈到文件系統位置。我想在我的 TeamCity 建構伺服器上執行此操作,因此我需要使用解決方案執行程序或 msbuild 執行此操作。我嘗試使用 Publish 目標,但我認為這可能適用於 ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy我基本上想做一個 Web 部署項目所做的事情,但沒有外掛。我需要它來編譯 WAP、刪除任何不需要執行的文件、執行任何web.config 轉換並將輸出複製到指定位置。
我的解決方案,基於 Jeff Siver 的回答
<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 工具版本:4.0 執行平台:x86 目標:包 MSBuild.exe 的命令行參數:/p:Configuration=Debug這將編譯、打包(使用 web.config 轉換)並將輸出保存為工件。唯一缺少的是將輸出複製到指定位置,但這可以在另一個具有工件依賴項的 TeamCity 建構配置或使用 msbuild 腳本中完成。
更新
這是一個 msbuild 腳本,它將編譯、打包(使用 web.config 轉換)並將輸出複製到我的登台伺服器
<?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 部署(也稱為 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