﻿# 活用 Visual Studio 2010 組態管理員進行方案與專案組態管理

早在之前的 Visual Studio 就已經內建了**組態管理員 (Configuration Manager)**，但我發現真正在使用組態管理員的人並不多，這是一個非常好用的方案管理工具，在很多情況下我們會因為某些狀況而需要對方案裡某些專案的程式碼進行一些調整才能正常執行，總不能每次換個開發環境就得辛苦的改一次，這時我們就可以藉助新增或修改 **組態管理員** 裡的 **方案組態 (Solution Configuration)** 達到快速切換的目的。

為避免有人不知道何謂 **組態管理員 (Configuration Manager)**，不確定的人可以參考以下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7c63e9380a23516d8a31-image_1327.png)

當我們點選如上圖的「組態管理員…」時會出現[組態管理員對話方塊](http://msdn.microsoft.com/zh-tw/library/t1hy4dhz.aspx)：

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4d9c98588f183e007a00-SNAGHTML90ab79a_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8b1efe01fefc007fca66-SNAGHTML90ab79a.png)

在這裡有幾個重要的觀念必須先提及：

-   一個**方案** ( Solution ) 包含多個**專案** ( Project )  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e6475ef48516b6b99bee-image_1328.png)
-   在 **方案檔** ( \*.sln ) 裡會定義所有可被使用的 **方案組態 (Solution Configuration)** 名稱  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8268656e2d36068f8473-image_1329.png)
-   在 **方案檔** ( \*.sln ) 裡定義的那些 **方案組態** 也可以設定在專案裡，設定在專案檔裡可視為是「**專案組態**」，但這是一樣的東西，只是個名字而已。在 **方案檔** ( \*.sln ) 裡會定義 **方案組態** 與 **專案組態** 的對應關係。而在 **專案檔 ( \*.csproj )** 裡會定義不同組態的 **屬性 (Property)** 設定，這些就是你之後要自己定義的部分：  
    [![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d07b9f2af3e5b85e1c95-image_thumb_83.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ca94b5d1e4bac4a3ae1e-image_1330.png)
-   請注意：**方案組態**只是個名稱而已，**每個組態**被賦予的**意義**與**屬性**是「你」要負責定義的
-   在 Visual Studio 2010 的所有專案範本裡都會有兩個預設的方案組態：

-   Debug
-   Release

-   這兩個預設的方案組態分別被「定義」如下：

-   Debug

-   編譯組件時會包含 Debug Symbol ( 包含**原始碼**與**行號**的偵錯資訊 )
-   編譯組件時不會對組件最佳化
-   預先定義了 DEBUG 與 TRACE 這兩個 **編譯常數 (Constants)**

-   Release

-   編譯組件時不會包含 Debug Symbol ( 只有基本的資訊，不含**原始碼**與**行號**資訊 )
-   編譯組件時會對組件最佳化
-   預先定義了 TRACE 這個 **編譯常數 (Constants)**

先瞭解了基本觀念後，我們再來看看 Visual Studio 2010 裡的 GUI 介面，就會豁然開朗的理解為什麼有這些設定選項！我們先不看「方案組態管理員」而先來看看「專案屬性頁」裡的設定。

請先點選**方案總管**裡的任意一個專案並按下鍵盤的 **Alt + Enter** 即可開啟「專案屬性頁」。

開啟後你會發現在專案屬性頁裡有許多頁籤都有「組態」下拉選單可以切換，預設的情況下有 Debug 與 Release 可以選擇，**但請注意**：唯有標示「**使用中**」的組態才是你在編譯專案時的組態！

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b7b079d96420fbda3802-image_thumb_84.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/873788f310318e6a4b6d-image_1331.png)

另一個需要注意的地方是：下圖右上角的「方案組態」被切換至 Debug，代表你在對方案或專案進行編譯時，是以「方案組態」的 Debug 進行編譯，而且只是編譯在該組態下「使用中」的組態！如果你如下圖所示，手動切換組態到 Release 的話，所代表的意義是「你要修改 Release 專案組態的設定」而已，並不是把該專案切換到 Release 組態進行編譯！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/85f33e402abc18975866-image_1332.png)

還記得文章稍早提到的一個觀念是：**方案檔** ( \*.sln ) 裡會定義 **方案組態** 與 **專案組態** 的對應關係。**所以 Visual Studio 2010 在編譯專案時，是透過「方案組態」裡的對應來選擇專案組態進行編譯的！**

我公司有位開發人員先前真的遇到過這樣的問題，他跟我說他明明已經切換「方案組態」到 Debug 但是 ASP.NET MVC 在編譯的時候卻每次都會 **Build View**，由於 **Build View** 的動作只會在被設定為 Release 的時候才會動的，我去幫他看的時候才發現原他的方案組態是如下圖這樣設定的，難怪編譯的時候都跟自己想像的不一樣！ 解決方法就是來到組態管理員修正這個「對應關係」，把下圖專案的**組態**都調回 Debug 即可。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f3276fb32fd3c524984e-SNAGHTML9318e88.png)

瞭解了 **方案組態** 與 **專案組態** 的對應關係是個很重要的里程碑，這可以讓你更加清楚的掌控方案與各專案組態的設定。

接著我們再回到「專案屬性頁」查看建置設定，如下圖示，在 Visual Studio 2010 裡內建了兩個常數可以勾選，分別是 **DEBUG** 與 **TRACE** 常數，而這類常數的使用方式我之前已經在【[如何善用「偵錯模式」進行 ASP.NET 網站或 .NET 程式開發](/post/2009/09/16/How-to-utilize-Debug-mode-to-develop-aspnet-and-other-net-applications.aspx)】文章裡提過，因此不再贅述。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1d1be38db1cac57315b9-image_1333.png)

不過如果你想更進一步自訂常數的話，可以在「條件式編譯的服務」欄位自行設定，如果有多個符號要設定可以用半形的分號 ( **;** ) 間隔，如下範例：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/baf4de172e2faae4a16c-image_1334.png)

除了常數設定外，還有許多屬性可以設定，而且在不同的頁籤裡也能依據不同組態進行設定，例如 **封裝/發行 Web**  就能設定完全不一樣的部署參數。另外在「單鍵部署」的設定裡也能依據不同的**方案組態**進行不同的參數設定，讓你在切換不同的方案組態後連「單鍵部署」也能輕鬆的切換設定。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/867fe853692aa172dc0a-SNAGHTML93ea718.png)

像我們在實務的開發專案裡，由於一個專案可能會有好幾個執行環境，透過妥善的方案組態規劃，就能做到輕鬆開發、輕鬆部署的目的，這感覺要真的用過才能體會其美妙之處了！

最後，來講如何**新增**組態設定。新增組態設定要在「組態管理員」裡進行設定，如下圖示點選「新增」：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/29c78a829a63a84b657a-SNAGHTML94229be.png)

新增方案組態時有三個欄位可設定，而這裡也是我認為許多人容易搞錯的地方，在此特別說明。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/45d1b7f059eeda527632-SNAGHTML946560c.png)

如圖示依編號來說明各欄位的意義：

1.  設定一個**組態名稱**
2.  通常我會建議可以在**複製設定值來源**裡選一個複製的對象，如果你是需要新增一個組態是需要有 Debug Symbol 的環境，建議你選取 “Debug” 組態！如下圖就是我同事之前選錯的主因，他選到了 Release 以致於自訂的組態在編譯專案時永遠都以 Release 組態來編譯專案。
3.  當新增**方案組態**時，可以選擇要不要一併建立 **專案組態**。請記得：**方案檔** ( \*.sln ) 裡會定義 **方案組態** 與 **專案組態** 的對應關係。**所以 Visual Studio 2010 在編譯專案時，是透過「方案組態」裡的對應來選擇專案組態進行編譯的！**既然是對應關係，當然你可以有「方案組態」而不需要額外定義「專案組態」摟，不過為了簡化複雜度，通常我也會建立一組同名的**專案組態**，以免不知情的新手誤觸地雷。

備註：因為 DebugSymbols 與 DebugType 這兩個選項並無法透過 Visual Studio 2010 的 GUI 介面進行勾選，如果你在新增方案組態時沒有選取「複製設定值來源」的「Debug」選項，你就必須要一一修改各專案檔裡的這兩個屬性設定，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3528f9c9cb13822d2135-image_1335.png)

去年有次有個同事請我幫他看為什麼在一個方案裡有多個 ASP.NET 專案，就只有其中一個專案無法進入偵錯，單步偵錯也都進不去，我幫他解決這個問題時才發現原來就是 **<DebugSymbols>** 與 **<DebugType>** 沒有設定好的關係！（心想：我怎麼會去研究出這種東西我也不清楚，遇到這種亂七八糟的問題正是你成長的機會阿，換個角度想把，別再跟 Visual Studio 2010 賭氣了 ^\_^ ）

新增完後會在組態管理員裡看到如下圖的畫面：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b626bdaa0ec9c4103e88-SNAGHTML94c4cc8.png)

最後，由於 Visual Studio 2010 偶爾會有當掉的時候，做完方案組態設定後預設不會自動存檔，建議你按一下「**全部儲存**」按鈕將設定寫入到**方案檔**與**專案檔**中就可以安心了！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a366dfd895d1a563489e-image_1336.png)

**相關連結**

-   [組態管理員對話方塊](http://msdn.microsoft.com/zh-tw/library/t1hy4dhz.aspx)
-   [如何善用「偵錯模式」進行 ASP.NET 網站或 .NET 程式開發](/post/2009/09/16/How-to-utilize-Debug-mode-to-develop-aspnet-and-other-net-applications.aspx)
