Asp.net

如何使用 msbuild 發佈網頁?

  • June 22, 2010

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.Configurationenv.ProjectName的參數env.DeployServiceUrl。MSBuild 執行器具有建構文件路徑,並且參數自動傳遞(您不必在命令行參數中指定它們)。

您也可以從命令行執行它:

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

引用自:https://stackoverflow.com/questions/3097489