具有多個環境的 MsBuild 和 MsDeploy
是否有將解決方案配置映射到環境並使用 MsDeploy 為每個環境打包的良好模式?
最短版本:獲取此文件,並嘗試更改 .msbuild 文件以創建一個包。
細節
我有一個包含大量庫和 ASP.NET MVC 應用程序的解決方案。我使用呼叫主解決方案的 msbuild 文件驅動建構,然後執行其他操作。我想使用新的 msdeploy 打包來準備一個 .zip 文件以供以後分發,但我遇到了各種困難。
我的解決方案有 4 種配置:
Local、Dev、Test和Prod,它們與我要映射到的環境相匹配。在該解決方案中,所有庫都具有Debug和Release往常一樣的模式。例如,在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 );這個項目文件只包含一些目標(Build,Clean,Rebuild,Publish,…)
解決方案: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:表示封包件的文件路徑
附加連結: