﻿# ASP.NET 網站部署可考慮使用 Web Deployment Project

Web Deployment Project (WDP) 是一個在 Visual Studio 外掛上去的專案類型，主要目的是提供你將現有 ASP.NET Website Project (網站專案) 或 ASP.NET Web Application Project (網站應用程式專案) 另一種部署網站的方式，讓你開發的網站在建置、封裝、部署時擁有更多的選項，也讓網站部署更加方便與自動化。

對於有些人來說也許不瞭解 **ASP.NET 網站專案** 與 **ASP.NET 網站應用程式專案** 的差別，建議可參考[黑大](http://blog.darkthread.net/)的 [Web Site Project vs Web Application Project](http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/01/25/web-site-project-vs-web-application-project.aspx) 文章。

若我們有一個 ASP.NET Website 專案，並且希望將網站預先編譯後部署到正式主機的話，若不靠 WDP 我們會用 VS2008 內建的 Publish Web Site ( 發佈網站 ) 功能 (如下左圖)，但缺點就是會輸出一大堆組件，事實上對部署網站來說是一大負擔，你總不希望每次部署網站都要砍掉所有資料再重新上傳吧。

![Publish Web Site ( 發佈網站 )](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4ae10d6d38be12aaf395-image_3.png "Publish Web Site ( 發佈網站 )") ![Add Web Deployment Project](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6fb93b96b850acdd2b61-image_6.png "Add Web Deployment Project")

這時你就可以改用 Web Deployment Projects，但與 Publish Web Site 的操作方式不太一樣，Publish Web Site 是直接將網站發佈到一個目錄下，但 Web Deployment Projects 必須先新增一個獨立的 WDP 專案到方案中 (加入方式如上右圖)，然後先預先設定**組件名稱**(Assembly Name)與**網站建置時的輸出目錄**。

![Add Web Deployment Project](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b7b971cb1386140ee941-image_12.png "Add Web Deployment Project")

接著就可以直接編譯網站或開啟 WDP 專案的屬性設定頁面進行設定。

![Build Web Deployment Project](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f2f21315102e7f016762-image_18.png "Build Web Deployment Project")![Web Deployment Project Property Pages](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c3d7cfb0f305aa35e82e-image_15.png "Web Deployment Project Property Pages") 

對於屬性設定頁面每個欄位的說明，大多都很容易看懂，至於詳細的說明各位可到 [Using Web Deployment Projects with Visual Studio 2005](http://msdn.microsoft.com/en-us/library/aa479568.aspx) 查詢，這頁的說明一樣適用於 VS2008 的開發環境。

但對於一些 Property Pages 的選項，有些挺實用的設定我想特別說明如下：

**Configuration Properties –> Output Assemblies**

![Web Deployment Project Property Pages :: Configuration Properties –> Output Assemblies](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5d8280f204979b37893f-image_21.png "Web Deployment Project Property Pages :: Configuration Properties –> Output Assemblies")

在 Output Assemblies 分類中有四個選項，預設是第一個選項，他可以將整個網站編譯成單一組件，其中包括所有頁面、使用者控制項、App\_Code、App\_WebReferences、...等目錄編譯的結果。但我比較中意第三個設定，他可以將所有跟使用者介面(UI)有關的頁面程式碼編譯到一個組件中，其他像是 App\_Code、App\_WebReferences、...等目錄都會個別建立不同的組件，這也意味著未來若有頁面程式更新時，你只需部署相關的組件即可，減少部署時網路傳輸的時間。

**Configuration Properties –> Deployment**

![Web Deployment Project Property Pages :: Configuration Properties –> Deployment](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/36a93099be47e86f23eb-image_24.png "Web Deployment Project Property Pages :: Configuration Properties –> Deployment")

在 Deployment 分類中的設定是我最愛的部分了，他可以讓你的自訂許多「部署」時的狀況，我先說明各參數的用途：

-   Enable Web.config file section replacement
    -   你可以在開發時用自己的 web.config 設定，但是在部署的時候動態替換成另一個 web.config 的內容，例如你可以替換 appSettings 或 connectionStrings 的內容。
    -   這裡可以設定 WDP 在進行編譯/部署時(按下 Build 等同於部署動作)，在網站專案輸出根目錄下的 Web.config 是否有哪個區段(section)要被取代，如上圖設定，你的 ASP.NET 專案中也必須要有 appSettings\_Staging.config 與 SQL2005\_Staging.config 檔案才行。
    -   appSettings\_Staging.config 的內容範例如下，一個檔案只能包括一個**區段**的資料：
        
        ```
        <?xml version="1.0"?>
        <appSettings>
          <add key="test" value="TEST123"/>
          <add key="test1" value="TEST123"/>
          <add key="test2" value="TEST123"/>
          <add key="test3" value="TEST123"/>
        </appSettings>
        ```
        
-   Enforce matching section replacements
    -   由於你可以在開發環境自行定義 appSettings 的參數數量，有時後你自己加了一個參數後很有可能會忘了將「要部署的 web.config」也加上這個參數，勾選這個選項就可以避免這種人為疏失的發生。
-   Use external configuration source file
    -   若這個選項不勾選，原本的 web.config 內容就會依據 **Enable Web.config file section replacement** 的設定直接替換掉內容。
    -   若勾選了此選項，原本 web.config 內的區段就會被改成用外部載入的方式宣告，例如：
        
        ```
        <appSettings configSource="appSettings_Staging.config" />
        ```
        
-   Remove the App\_Data folder from output location
    -   通常 App\_Data 目錄用來儲存一些網站相關的資料，例如 SQLExpress 資料庫或其他檔案。而這些資料通常會在不同的執行環境有不同的資料，例如在測試機會有測試用的資料，在正式機會有正式版的資料，通常在部署的時候不會希望蓋掉這些資料。
    -   若勾選此選項，在進行編譯/部署時就會直接將 App\_Data 目錄整個移除，讓你複製這些檔案過去時不用再手動刪除一遍。
-   Configuration
    -   可以讓你切換組態的模式，預設有 Debug 與 Release，你還可以額外自訂，例如：Staging ( 測試環境 )。
    -   意思也就是說，以上的設定可以設定好幾組，你只要切換不同的模式 (如下圖)，就可以輸出不同執行環境的部署檔案，方便你將檔案複製到目的主機。  
        ![切換不同的 Configuration 模式](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e47ac48568483a715731-image_27.png "切換不同的 Configuration 模式")
    -   你也可以透過 Configuration Manager 定義不同的 Configuration 模式是否要編譯 Web Deployment Project 專案，例如說你在 Debug mode 應該就不需要建置 WDP 專案 (如下圖示)，你可以設定 Release 或 Staging 時才需要編譯此專案，並自動產生部署檔案：  
        [![透過 Configuration Manager 定義不同的 Configuration 模式是否要編譯 Web Deployment Project 專案](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0ec64eb52827fab11d64-image_thumb_9.png "透過 Configuration Manager 定義不同的 Configuration 模式是否要編譯 Web Deployment Project 專案")](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ebb9765e77f1b04bcc66-image_29.png)

\---

除了透過 Visual Studio 介面的設定外，事實上你還可以自行修改 Web Deployment Project 的專案檔( \*.wdproj )，此專案檔其實就是透過 [MSBuild](http://msdn.microsoft.com/zh-tw/library/0k6kkbsd.aspx) 編譯執行的，因此這個設定檔可以讓你自訂所有要在編譯時需進行的任何自訂動作。

![你可以自行修改 Web Deployment Project 的專案檔( \*.wdproj )，此專案檔其實就是透過 MSBuild 編譯執行的](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4915ffa81d0c070b0567-image_32.png "你可以自行修改 Web Deployment Project 的專案檔( *.wdproj )，此專案檔其實就是透過 MSBuild 編譯執行的")

舉幾個例子來說：

-   在 Staging 模式時，你可以修改 \*.wdproj 自訂動作將建置完的檔案直接複製到 Staging 主機
-   在建置之前(BeforeBuild)刪除一些部署時不必要的檔案或目錄 (例如 .svn 或 \_svn 目錄)
-   在建置完成(AfterBuild)後將所有 \*.js 檔案壓縮，或將 jQuery 改由 Google AJAX Libraries API 載入

[MSBuild](http://msdn.microsoft.com/zh-tw/library/0k6kkbsd.aspx) 也是另一套超級強大的工具，對於每日建置(Daily Build)或需要開發流程自動化的人，一定要熟悉這套工具如何操作，以下是一些相關連結：

-   [MSBuild 參考](http://msdn.microsoft.com/zh-tw/library/0k6kkbsd.aspx)
-   [MSBuild 命令列參考](http://msdn.microsoft.com/zh-tw/library/ms164311.aspx)
-   [MSBuild - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/MSBuild)
-   [MSBuild Sidekick - GUI editor and debugger for MSBuild scripts](http://www.attrice.info/msbuild/) (付費商用軟體)
-   [Open Source MSBuild Community Tasks Project](https://github.com/loresoft/msbuildtasks) ( 一堆社群分享的 Tasks 函示庫 )
-   [Inside MSBuild - Compile Apps Your Way With Custom Tasks For The Microsoft Build Engine](http://msdn.microsoft.com/zh-tw/magazine/cc163589\(en-us\).aspx)
-   [WiX 秘訣 - 使用 MSBuild 和 Windows Installer XML (WiX) 自動化發行作業](http://msdn.microsoft.com/zh-tw/magazine/cc163456.aspx)

若要下載 Web Deployment Projects 可以參考以下網址：

-   [Visual Studio® 2008 Web Deployment Projects – RTW](http://web.archive.org/web/20130120130153/http://www.microsoft.com/en-us/download/details.aspx?id=25163)
-   [Visual Studio 2005 Web Deployment Projects](http://msdn.microsoft.com/en-us/asp.net/aa336619.aspx)\[ [直接下載](https://www.iis.net/downloads/microsoft/web-deploy) \]

**相關連結**

-   [Using Web Deployment Projects with Visual Studio 2005](http://msdn.microsoft.com/en-us/library/aa479568.aspx)\[同時適用在 VS 2008 使用,推薦閱讀\]
-   [ScottGu's Blog](http://weblogs.asp.net/scottgu/) - [VS 2008 Web Deployment Project Support Released](https://weblogs.asp.net/scottgu/vs-2008-web-deployment-project-support-released)
-   [ScottGu's Blog](http://weblogs.asp.net/scottgu/) - [VS 2005 Web Deployment Projects](https://weblogs.asp.net/scottgu/429723)
-   [Announcing RTW version of Visual Studio 2008 Web Deployment Projects (WDP)](https://devblogs.microsoft.com/dotnet/announcing-rtw-version-of-visual-studio-2008-web-deployment-projects-wdp/)
-   [Microsoft Web Deployment Team Blog](https://blogs.iis.net/msdeploy)
-   [KB-小心Web Deployment Project的Class名稱重覆陷阱](http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/04/20/725.aspx)
-   [文章-ASP.NET 2.0專案部署問題研究](http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/04/06/689.aspx)

**2010/8/11 補充**

-   [Visual Studio® 2010 Web Deployment Projects - RTW](http://web.archive.org/web/20120305132317/http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24509)
-   [Visual Studio® 2008 Web Deployment Projects - RTW](http://web.archive.org/web/20120128020214/http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=25163)
