[小菜一碟] 手動為 Windows Form 應用程式加入組態設定轉換(Configuration Transform)

有開發過 ASP.NET 網頁應用程式的朋友,應該對 Web.ConfigWeb.Debug.ConfigWeb.Release.Config 這三個設定檔不陌生,在建置專案的時候,建置程序會依據組態(Debug|Release)進行設定轉換,產出專屬於該組態的 Web.Config,如果換作是 Windows Form 應用程式的 App.Config 的話,該怎麼做?

原本這件事情,在 Visual Studio 2019 以前有一個擴充套件 - Configuration Transform,安裝之後,只需要滑鼠在 App.Config 上按個右鍵點一下「Add Config Transforms」就搞定了,但是這個擴充套件目前的狀態是已經被作者給放生了,不支援 Visual Studio 2022,不過組態設定轉換自己手動加也不難,我們就來看看怎麼加?

複製出 App.Debug.Config 及 App.Release.Config

我們先在 Visual Studio 依據我們想要的組態名稱,複製出 App.{組態名稱}.Config 設定檔,專案預設就已經有兩個組態 DebugRelease,我們如果沒有其他組態的話,就只需要複製出 App.Debug.Config 及 App.Release.Config。

複製好後,我們修改 csproj 檔案,讓這兩個檔案能夠依附在 App.Config 下面。

那複製出來的兩個設定檔,我們就把檔案內容用下面的內容先取代掉,如果我們已經有用 Web.config Transformation Syntax 寫好的內容,直接拿來取代也可以。

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
</configuration>

使用 TransformXml Task

接著,我們繼續修改 csproj 檔案,在 </Project> 前面加入下面這一行,使用 <UsingTask> 告訴 Visual Studio 說我們要使用 TransformXml 這個 Task,TransformXml 是存在於 Microsoft.Web.Publishing.Tasks.dll 裡面的一個類別。

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />

將 TransformXml 加入建置流程

一樣繼續修改 csproj 檔案,接續 <UsingTask> 後面往下加入 <Target>,名稱為 AfterCompile,條件控制是 Exists('App.$(Configuration).config'),意思就是說,當條件成立時,執行宣告的程序。

而要執行的程序,就是組態設定轉換的程序,接著只要將編譯過後的設定檔輸出到目標資料夾就可以了。

<Target Name="AfterCompile" Condition="Exists('App.$(Configuration).config')">
  <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
  <ItemGroup>
    <AppConfigWithTargetPath Remove="App.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>

最後,我們只要用 Web.config Transformation Syntax 來為我們的不同組態編寫設定值,到時候建置成功之後,設定檔就會依據組態轉換成我們所定義的值。

支援 ClickOnce 發布作業

有一些朋友會使用 ClickOnce 來發布應用程式,要使用組態設定轉換的話,需要在 AfterPublish 將設定檔替換掉,我們接著在 csproj 檔案往下加入下面這一段設定就可以了。

其他的設定檔

如果我們有其他的設定檔是 XML 結構的,我們也可以使用組態設定轉換,以 log4net 的設定檔為例,當我們依據組態名稱複製出設定檔之後,修改 csproj 檔案,加入 AfterBuild 的設定。

<Target Name="AfterBuild" Condition="Exists('log4net.$(Configuration).config')">
  <TransformXml Source="log4net.config" Destination="$(OutputPath)log4net.config" Transform="log4net.$(Configuration).config" />
</Target>

一樣用 Web.config Transformation Syntax 編寫設定檔,建置成功之後,設定檔就會依組態來轉換。

以上,用手動的方式來完成組態設定轉換就分享給大家,希望對大家有一點幫助。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學