MSDeploy 是 Visual Studio 2010 提出的 Web 應用程式部署功能,改變了以往的 Web 應用程式部署的方式,不但簡化很多的工作,也可以有效率進行多類型與多組態的部署作業。
Web 應用程式的部署我想對於許多的 ASP.NET Developers 來說也是一項有點頭痛(但又不會太痛)的問題,Visual Studio 以往的版本在 Web 部署的功能,老實說都不太盡人如意,Visual Studio 2005 在 Web 部署的功能總算有比 Visual Studio 2002-2003 好一點,不過它還是欠缺了一些功能(例如資料庫部署),以及能夠直接修改目標伺服器上的組態設定的能力,在之前的若想要做到連同目標伺服器的組態設定一起做的話,大概只會有一個答案:使用 Windows Installer 來部署。在 IIS 7.0 以及 Visual Studio 2010 開始,微軟試圖想在 Web 部署上給所有 ASP.NET Developers 一個合適且不錯的解答,其中 IIS 7.x 上的解決方案:Web Deployment Tool 已經隨 Web Platform Installer 2.0 發布,可以到 http://www.iis.net/expand/webdeploymenttool 參考,而本文著重的是 Visual Studio 2010 上提出的 Web 部署解決方案。
這是 Visual Studio 2010 提出的新功能,它具有發布 Web 應用程式以及 IIS 設定到遠端 IIS 伺服器的功能,它也是 Visual Studio 2010 首推的部署方法,只要是使用 ASP.NET 並且對方是 IIS 7.x 的話,這個方法可以確實有效的將部署的所需工作大量簡化。MSDeploy 是由 IIS 的 Web Deployment Team 自 2008 年開始開發的,原本是要強化 IIS 7.0 上的 ASP.NET 應用程式部署的能力,它在 Beta 初期就已經導入 Microsoft.com 的內部系統使用,經過內部系統的千錘百鍊之後,終於在 2009 年 9 月 24 日隨著 Web Platform Installer 2.0 發布 RTW,它的部份功能也被移植到 VS 2010 上,也就是 MSDeploy Publish 功能。在 Web 應用程式專案上按右鍵,選擇 Publish,可以看到部署的設定選項:
Visual Studio 2010 的部署工具增加了設定檔儲存的功能,供開發人員可以設定多重的設定檔,可適應相同的應用程式部署到不同的環境(或主機),像是 DevServer, StagingServer, ProductionServer 等等,VS 2010 除了 MSDeploy 功能 (取代原本的 IIS) 外,原有 VS 2008 中的 FTP, 檔案系統以及 FrontPage Server Extension (FPSE) 的部署功能都在。
那麼 MSDeploy 到底是什麼呢?其實它是一種基於 Provider 為功能,以管線化 (Pipeline) 方式部署 Web 應用程式的一種引擎,與 MSBuild 相對於編譯與建造應用程式的角色相似,MSDeploy 利用管線化的功能來處理其部署流程,而每個部署流程都來自於各種不同的 Provider,整個流程就像下圖一樣(來源:PDC09 Session: Web Deployment Painkillers: Microsoft Visual Studio 2010 & MS Deploy):
MSDeploy 內建有針對 IIS 以及 Database (SQL Server) 以及上傳檔案的 content provider,足以支援大多數的 ASP.NET 的部署工作了,若想要往 MySQL, Oracle, Apache, PHP 平台上部署的話,則可以再利用 MSDeploy 所提供的 Provider 介面來開發,即可利用 MSDeploy 的功能來部署。
MSDeploy 另一個重要提出概念是 Web 封裝 (Packaging) 的概念,Web 封裝是一個壓縮的封裝檔,這個封裝檔可以封裝 IIS 的所有與應用程式相關的 IIS 設定,以及必要的資料庫設定等都存在同一個 Package 中,並利用檔案傳輸方式上傳到具有 MSDeploy 的遠端伺服器上,再由遠端伺服器透過管線化的處理方式來將封裝安裝到 Web Server 上。下圖可以顯示 Web Package 在部署上的作用(來源:PDC09 Session: Web Deployment Painkillers: Microsoft Visual Studio 2010 & MS Deploy)。
MSDeploy 的 Web 封裝可以在專案屬性的 “Package/Deploy” 以及 “Deploy SQL” 兩個部份設定,Package/Deploy 可設定是否要在封裝中加入與 ASP.NET 應用程式相對應的 IIS 設定:
1. Items to deploy using FTP, FPSE, File System or Web Deployment Tool 可以決定要部署專案中的哪些檔案,是否要包含除錯符號檔 (.pdb) 以及是否要部署 App_Data 資料夾中的檔案。
2. 設定 MSDeploy 是否要部署資料庫 (Include all Databases configured in Deploy SQL Tab) 以及封裝 IIS 的設定 (Include all IIS settings for this web project as configured in IIS Manager),也可以進一步設定是否要再加上 App Pool 的設定 (Include Application Pool settings used by this web).
3. 設定部署的封裝路徑,包含本機以及遠端。
Deploy SQL 則可以設定與資料庫有關的部署設定,其中最令人激賞的是,不但連資料結構 (schema) 可以部署,連資料 (data) 都可以部署。
1. Database Entries 可以設定來源資料庫的連線字串(並加到 Source Database Information),來源可以是 Web.config 或是自行輸入。
2. 設定目標的 SQL Server 連線字串,以及決定要如何部署(支援 Schema Only, Schema and Data, Data Only 三種方式),若有額外的 SQL scripts 也可以一併加進去。
Note: 封裝 IIS 設定的功能,只有在將應用程式掛載於 IIS 伺服器時才可以使用,若是掛載在 ASP.NET Development Server 時是無法使用的,也就是說,在 Web 的設定中,若是選擇 “Use Visual Studio Development Server” 的話,就無法使用這個功能,要選擇 “Use Local IIS Web Server” 才能夠使用這個功能。