有開發過 ASP.NET 網頁應用程式的朋友,應該對 Web.Config
、Web.Debug.Config
、Web.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
設定檔,專案預設就已經有兩個組態 Debug
及 Release
,我們如果沒有其他組態的話,就只需要複製出 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 編寫設定檔,建置成功之後,設定檔就會依組態來轉換。
以上,用手動的方式來完成組態設定轉換就分享給大家,希望對大家有一點幫助。