﻿# 使用 MSDeploy 手動部署網站時如何避免 Web.config 被更新

使用 [Web Deployment Tools](http://www.iis.net/expand/WebDeploymentTool) 工具 ( 又稱 Web Deploy 或 MS Deploy ) 進行網站部署是在簡單不過的事，有興趣的人可以參考 [介紹好用工具：Web Deployment Tool 1.0 ( 附心得筆記 )](/post/2009/11/23/Useful-tool-Web-Deployment-Tool.aspx) 文章或 [ASP.NET MVC 2 開發實戰](http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789866348624&sid=58261) 書籍【第11章 安裝部署】的說明，不過若更新網站時希望可以跳過更新一些重要檔案，例如 ：Web.config 等，這時就必須加上特別的參數才行，這參數非常特別必須另做筆記才不會忘記。

這篇文章我們以 Visual Studio 2010 的「建置部署套件」功能來解說整個手動部署網站的步驟如下：

1\. 先查看 **封裝/發行設定** 的設定值

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5f5817e2c1e0b1701044-image_134.png "title")

2\. 由下圖得知「要建立封裝的位置」會在專案的 obj\\Debug\\Package\\ 目錄下，並會產生 MyWeb.zip 檔

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7964531997dd95280f89-image_135.png "title") 

3\. 接著我們直接建置部署套件產生封裝檔

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c7f6d362d054f7dd3fe3-image_136.png "title") 

建置完成後可以在 obj\\Debug\\Package\\ 目錄下找到一堆檔案，你可以將如下圖紅線框起來的地方複製到要部署的正式主機上：

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/24ae7e34d392b146184f-image_137.png "title")

4\. 在要部署的主機上先確認 IIS 的站台是否已經建立（我們以 IIS6 為例），站台名稱必須與上述第2個步驟所示的 **要在目的伺服器上使用的 IIS 網站/應用程式名稱** 欄位所填的資料一樣才行！

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7568c5d04540ab2b7d06-image_138.png "title")

5\. 我們進入命令提示字元進行手動安裝，直接用 Visual Studio 2010 幫我們建立的指令檔 ( MyWeb.deploy.cmd ) 代入參數 **/Y** 即可將網站安裝完成！

```
MyWeb.deploy.cmd /Y
```

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/50b19901902281a15ace-image_139.png "title")

第一次安裝完之後，我們通常會手動修改 Web.config 的參數以符合正式機上的環境要求，不過修改過之後若要再次更新網站，其重要的 Web.config 就很有可能會被重新封裝過的檔案覆蓋掉。

例如我先修改已安裝部署好的主機上的 Web.config 檔案內容後，再次執行上述指定重新安裝網站一次，你會看到我們的 Web.config 檔案被更新了，也因此之前做過的變更也都會全部消失。

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b5b56b2afca24e4ae39b-image_140.png "title")

解決這個方法有兩種方式，一種是用 Visual Studio 2010 內建的 **Web.config Transformation** 功能，我認為這個方式是比較好的方式，不過並不見得每個人都會想這樣管理設定檔，畢竟有些時候開發人員管不到正式機上面的檔案，這是負責部署的 IT 人員就必須學會第二種方法。

另一個方法就是在執行指令檔時額外加上 MSDeploy 可接受的參數 **–skip** 以跳過相關檔案的更新部署！

要加上參數如下範例所示：（注意：absolutePath 的參數值為 Regex 樣式比對的 Pattern 喔！）

```
MyWeb.deploy.cmd /Y "-skip:objectName=filePath,absolutePath=Web\.config"
```

執行完後你就會發現，就算正式機上的 Web.config 與封裝套件上的 Web.config 不一致也不會被覆蓋過去了，執行的畫面圖示如下：

![alt](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f694aad6aabc608699c8-image_141.png "title")

如此一來，你就可以在正式機安心的部署網站了！

**補充說明**

如果想先測試 MSDeploy 在安裝時到底會更新哪些檔案，可以加上 **\-whatif** 參數進行測試，加上此參數會將整個部署過程跑一遍，但不會真的將目的地的檔案進行新增、更新或刪除等動作，你可以藉此先確認過再正式更新檔案！如下指令範例：

```
MyWeb.deploy.cmd /Y -whatif
```

**相關連結**

-   [介紹好用工具：Web Deployment Tool 1.0 ( 附心得筆記 )](/post/2009/11/23/Useful-tool-Web-Deployment-Tool.aspx)
-   [如何使用 Visual Studio 2010 的「單鍵發行」功能](/post/2010/05/03/Deploying-Web-Application-Project-Using-One-Click-Publish.aspx)
-   [Web Deploy Operation Settings](http://technet.microsoft.com/en-us/library/dd569089\(WS.10\).aspx)
-   [Beta 2 skip and replace rules](https://blogs.iis.net/msdeploy/beta-2-skip-and-replace-rules/)
-   [What has changed about skip-replace rules in RC?](https://web.archive.org/web/20150104093713/http://blogs.iis.net/msdeploy/archive/2009/04/23/what-has-changed-about-skip-replace-rules-in-rc.aspx)
-   [Thread: msdeploy, skip files](http://forums.iis.net/t/1147954.aspx)
-   [Thread: MSdeploy Skip command](http://forums.iis.net/t/1162791.aspx)
-   [MSDeploy skip Thumbs.db files using a wildcard](http://creativeincode.wordpress.com/2009/12/09/msdeploy-skip-thumbs-db-files-using-a-wildcard/)
-   [Using MS Deploy Instead of the Copy Command In MSBuild](http://raquila.com/software/using-ms-deploy-instead-of-copy-command-in-msbuild/)
-   [ASP.NET Deployment Content Map](http://msdn.microsoft.com/en-us/library/bb386521.aspx)

-   [ASP.NET Web Application Project Deployment Overview](http://msdn.microsoft.com/en-us/library/dd394698.aspx)
