Dot-Net

具有多個環境的 MsBuild 和 MsDeploy

  • August 16, 2010

是否有將解決方案配置映射到環境並使用 MsDeploy 為每個環境打包的良好模式?

最短版本:獲取此文件,並嘗試更改 .msbuild 文件以創建一個包。


細節

我有一個包含大量庫和 ASP.NET MVC 應用程序的解決方案。我使用呼叫主解決方案的 msbuild 文件驅動建構,然後執行其他操作。我想使用新的 msdeploy 打包來準備一個 .zip 文件以供以後分發,但我遇到了各種困難。

我的解決方案有 4 種配置:LocalDevTestProd,它們與我要映射到的環境相匹配。在該解決方案中,所有庫都具有DebugRelease往常一樣的模式。例如,在Local解決方案模式下,所有庫都在模式下編譯Debug。然後,主應用程序有與解決方案匹配的環境,這樣我就可以擁有Web.Dev.config等等,這似乎是使用事物的自然方式。

如果我這樣打包:

<Target Name="BuildWebPackage">
 <MSBuild Projects="..\Publisher\Site\Site.vbproj"
          Targets="Package"/>
</Target>

我遇到了一個問題,Configuration=Local即錯誤地映射到Site.vbproj引用的庫項目,並且無法編譯它們。


我看到了兩種可能的解決方案:一種我無法正常工作,另一種非常難看。

嘗試 1

我嘗試Package通過解決方案呼叫目標(在此範例中,“應用程序”是 Site 項目所在的解決方案文件夾……我已經為這篇文章簡化了內容,因為解決方案中實際上有多個應用程序。)

<Target Name="BuildWebPackage">
 <MSBuild Projects="..\Publisher\Publisher.sln"
          Targets="Applications\Site:Package"/>
</Target>

我認為這種SolutionFolder\ProjectName:Target語法是如何做到這一點的,因為:Clean執行……但是,這會拋出

error MSB4057: The target "Applications\Site:Package" does not exist in the project.

嘗試 2

現在是醜陋的解決方案:如果我修改我的所有庫以為這 4 個解決方案配置添加 4 個附加配置,它就可以工作。但是,如果我以後想與具有不同環境的項目共同開發共享庫,這很醜陋,而且確實是一個糟糕的計劃。此外,這些環境與庫無關,僅在使用庫的頂級應用程序的上下文中才有意義。味道不好。


嗯?

我喜歡解決方案中的多個環境,以及花哨的新 Web.config 替換東西,但我不知道Package在這種情況下如何呼叫 msdeploy 任務,以便我可以在 TeamCity 中建構包。

(請注意,我可能不想呼叫 msdeploy 命令行,因為它用於將 IIS 應用程序轉換為包。不是我在這裡所做的。)


樣本

同樣,我在這裡完全被難住了,所以如果你想幫助實驗,我已經把這個範例解決方案放在一起。

第一次嘗試失敗,因為解決方案文件中不存在*包目標。*在解決方案文件上使用 MSBuild 時,會創建一個臨時 MSBuild 項目 ( SamplePackage.sln.metaproj );這個項目文件只包含一些目標(BuildCl​​eanRebuildPublish,…)

解決方案:DeployOnBuild & DeployTarget 屬性

做你想做的一種方法是像這樣使用DeployOnBuild屬性:

<PropertyGroup Condition="'$(Configuration)' == ''">
 <Platform>Any Cpu</Platform>
 <Configuration>Dev</Configuration>
 <PackageLocation>$(MSBuildProjectDirectory)\package.zip</PackageLocation>
</PropertyGroup>

<Target Name="Build">
 <MSBuild Projects="SamplePackage.sln"
          Targets="Build"/>
</Target>

<Target Name="BuildWebPackage">
 <MSBuild Projects="SamplePackage.sln"
          Properties="Platform=$(Platform);
                      Configuration=$(Configuration);
                      DeployOnBuild=true;
                      DeployTarget=Package;
                      PackageLocation=$(PackageLocation);"/>
</Target>
  • DeployOnBuild=true:必須在呼叫 Build 時進行部署
  • DeployTarget=Package:為部署創建一個包
  • PackageLocation:表示封包件的文件路徑

附加連結:

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