2014年8月7日 星期四

發佈網站時依據組態設定的不同而轉換 Web.Config

在一般開發專案的時候,我們會在組態對應的 Config 檔案裡添加在發佈時需要至換的設定值,這樣的轉換常常會用在資料庫連接字串的轉換,如果對於組態轉換 Web.Config 設定的操作不熟悉或是沒有這麼做的朋友,可以詳讀以下連結的 ASP.NET 官網教學文章,

ASP.NET Web Deployment using Visual Studio: Web.config File Transformations | The ASP.NET Site

這一篇就來看看如何讓我們在發佈網站的時候能依照選擇組態的不同,而轉換 Web.Config 的內容。

 


千萬不要在發佈網站的時候還繼續用那種直接在 Web.Config 裡做取代複製的手工作業,那樣的方式真的相當不聰明智也相當沒有效率。

前一陣子與一個團隊共同開發了一個大型專案,這個專案在 Web.Config 裡面放了有數百個的設定,然後部署環境又區分了好幾個,開發者本身的開發環境不說,公司內部就有自己的測試機器,然後客戶那邊又分了客戶開發環境、客戶測試環境、客戶 Staging 環境、客戶正式環境,每個環境的 Web.Config 內的設定值都會有所不同,每當要發佈到某一個環境的時候,就看到負責發佈的同事就要去修改設定值,各位可以想想,有數百個設定值要修改,光是比對、確認、修改就會耗費相當多的時間,而且有時候會需要分別部署到不同的環境。

所以最好的解決方式就是建立不同的組態檔,然後依據不同的組態檔再去建立轉換用的 Web.Config 檔案,如此一來再做發佈的時候就不用再花費那麼多的時間去做修改、比對、確認的動作。

講是這樣講,我也提過、也建議過,就是沒有人要接納我的意見,不知道是不會用還是什麼原因,總之每當要發佈某個環境的檔案時,就會看到負責發佈的人在那邊窮忙……

 

示範說明

我以「ASP.NET MVC 與 ASP.NET WebForm 使用 Simple Injector 切換選擇不同 Repository 原始碼下載」這一篇的專案原始檔來做示範(因為剛好在整理檔案並改放到 GitHub 上),這個範例專案剛好是在說明有不同的 Repository 實作專案可以給 Web 專案選擇使用,

image

而想要使用不同的 Repository 就必須要在 Web.Config 裡做修改,預設是使用「Sample.Repository.ADONET」

image

如果按照一般不使用組態轉換設定檔的作法,就會看到以下的內容,每次做發佈網站的時候再去修改設定檔的內容,

image

 

新增組態

就如同我前面所說的,如果要變動的設定值有很多的時候,而且又散落在 Web.Config 的各處時,就必須要在 Web.Config 去逐一修改裡面的內容,這樣做就真的很累人,所以比較好的方式就是去新增組態,然後在發佈網站的時候再去選擇要使用哪一個組態來發佈,

image

image

SNAGHTML18c40db

image

 

新增設定轉換

當完成組態的新增之後,接著就是去執行「新增設定轉換」的操作,

image

完成「」的操作之後,展開 Web.Config 項目,就可以看到有依據我們所新增的組態名稱所加入的 Web.EF.Config 與 Web.EntLibDAAB.Config 檔案,

image

把 Web.Config 下面的其中一個檔案打開來看,

image

裡面有簡單的範例與說明,但需要詳細資訊的話,就要查看裡面所提供的連結內容,

MSDN - Web 應用程式專案部署的 Web.config 轉換語法

以這篇文章所使用的範例,我只需要去轉換 AppSettings 裡面的設定,預設是使用 ADO.NET 所以三個 Web.Config 的轉換設定如下,

Web.Debug.Config

image

Web.EF.Config

image

Web.EntLibDAAB.Config

image

 

預覽轉換

這邊我是使用 VS2013,以下的操作狀況將會依據各位使用的環境不同而有所差異,大致上應該都差不多。

在某個已經完成轉換設定編輯的 Config 檔案按下滑鼠右鍵,在出現的功能選單裡選擇「預覽和轉換」,

image

「預覽和轉換」可以顯示那些地方的設定會做轉換,

image

 

又或者可以安裝 Visual Studio 的擴充套件「SlowCheetah - XML Transforms

image

image

可以透過 SlowCheetah 來做預覽的操作,

image

image

不過「SlowCheetah - XML Transforms」並不是只能對 Web.Config 做轉換處理,而是可以對 XML 檔案作處理,例如 NLog 的設定檔,或是主控台專案的 App.Config,有關這方面的訊息可以參考以下的連結內容。

Huan-Lin 學習筆記: 使用 SlowCheetah 轉換組態檔

透過 SlowCheetah - XML Transforms 讓你的 App.Config 也可以支援轉換語法 - 積沙成塔- 點部落

 

發佈網站

接著就是要做的就是發佈網站,我們依照不同的組態分別建立發行檔

image

SNAGHTML1ceddd5

SNAGHTML1cf3be4

SNAGHTML1cfe9e6

在接下來的「設定」項目裡,記得「組態」要選擇相對應的組態名稱

image

image

發佈完成之後,開啟在指定發佈目錄下的 Web.Config 檔案,就可以看到指定轉換的地方就換成組態設定的 Config 轉換內容,

image

image

image

 


這邊用了一個簡單的例子來做說明,希望透過這樣的簡單操作說明來讓大家可以瞭解,尤其是沒有使用過組態轉換設定檔的人,如此一來就不需要再手動去一項一項地去改變 Web.Config 設定值的內容了,當你要發佈的環境有很多,然後設定值的數量越來越多,就真的不要用手動的方式去修改,再少的設定項目都會有修改錯或是遺漏而往了修改的情況發生,更何況是為數龐大的設定項目的時候呢?

所以做個聰明又有效率的開發人員,馬上改用這種正規的方式吧!

 

參考連結

ASP.NET Web Deployment using Visual Studio: Web.config File Transformations | The ASP.NET Site

MSDN - Web 應用程式專案部署的 Web.config 轉換語法

SlowCheetah - XML Transforms

Huan-Lin 學習筆記: 使用 SlowCheetah 轉換組態檔

透過 SlowCheetah - XML Transforms 讓你的 App.Config 也可以支援轉換語法 - 積沙成塔- 點部落

 

以上

7 則留言:

  1. 感謝你的教學~ 最近正好再找多環境發不同web.config,對英文苦手的我一直一知半解,值到看到這篇文章才恍然大悟!!
    感謝了~

    回覆刪除
  2. 不錯的文章。這讓我想到另一個問題,我在發佈的時候,有辦法設定差異發行嗎?因為本身網站資料很大,常常只修改一點點,但發佈時都一大包。

    回覆刪除
    回覆
    1. Hello,
      如果發行是可以直接發行到網站所在的目錄,是可以在發行時只針對在編譯後有變化的檔案去做覆蓋,
      但如果是無法直接發行到網站目錄,而需要另外發行到自己電腦裡或是另外的目錄再整包做更新的話,
      現階段我沒有任何的建議與做法。

      刪除
  3. 請問一下,有辦法根據組態切換建置或發行時包含的檔案嗎?
    最簡單的例子是根據目標平台選擇不同的Native DLL。

    目前都用建置後命令列解決,但感覺不是那麼的...漂亮?

    回覆刪除
    回覆
    1. 還是要靠指令碼的方式來達成
      因為現在所用到的介面操作,也都是轉換成建置前或後的指令碼去執行
      除此之外應該沒有別的比較漂亮的做法
      而且以後的 ASP.NET 5 版本也都是要下指令的操作方式比較多

      刪除
  4. 您好
    請問如果在測試時只想將數個db table改為不同名稱但schema相同的測試用table
    有什麼比較快速的方法可以一次變更嗎?

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。