NuGet系列-製作安裝Package時自動設定Config

在NuGet還沒有出來前要在專案中加入組件的相關Config是挺麻煩的,要看著文件或範例來一段一段複制貼上Config,說真的不是很方便,但是NuGet有提供Config轉換,會把需要設定的Config合併到專案的Config中,可以省下不少設定時間,這篇就來跟大家說在建立Package時如何加入Config轉換檔。

在NuGet還沒有出來前要在專案中加入組件的相關Config是挺麻煩的,要看著文件或範例來一段一段複制貼上Config,說真的不是很方便,但是NuGet有提供Config轉換,會把需要設定的Config合併到專案的Config中,可以省下不少設定時間,這篇就來跟大家說在建立Package時如何加入Config轉換檔。

 

建立Config轉換檔

準備一個僅安裝時需要的Config檔,如下範列是我在製作Common.Logging.Elmah時的設定。

  <configSections>    
    <sectionGroup name="common">
      <section name="logging"t ype="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
    </sectionGroup>
  </configSections>    
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Elmah.ElmahLoggerFactoryAdapter, Common.Logging.Elmah">
        <arg key="Level" value="all"/>
      </factoryAdapter>
    </logging>
  </common>  
</configuration>

 

NuGet的Config檔的轉化檔在設計上很簡單,就跟平常在設定Config一樣一樣,相對的它沒有辦法做太多事,只能以XML的DOM,一個一個比對element的階層與內容,沒有完全相同的element就新增,如果element相同,但有一個attribute相同會合併設定,完全相同就略過,以下面的例子為例:

App.Config內容

  <appSettings>
    <add key="SetA" />
    <add key="SetB" value="App.Coinfg" />
    <add key="SetC" value="Same" />    
  </appSettings>
</configuration>

App.config.transform(transform為轉換檔的副檔名)內容

  <appSettings>
    <add key="SetA" vaule="Transformation" />
    <add key="SetB" value="Transformation" />
    <add key="SetC" value="Same" />
    <add key="SetD" value="Transformation" />
  </appSettings>
</configuration>

合併後的結果

                               //完全一樣,不處理  <appsettings>                               //完全一樣,不處理
    <add key="SetA" value="Transformation" /> //一個Attribute相同,合併
    <add key="SetB" value="App.Coinfg"/>     //雖然有一個Attribute相同,但另一個Attribute不同,不處理
    <add key="SetB" value="Transformation" /> //雖然有一個Attribute相同,但另一個Attribute不同,新增
    <add key="SetC" value="Same" />           //完全一樣,不處理
    <add key="SetD" value="Transformation" /> //沒有,新增
  </appsettings>                              
</configuration>                              

如果要寫某種情境下才新增設定,那就不能用Config轉化檔,可能要在NuGet的PowerShell安裝檔中寫Code來處理。

 

加入Package中

轉換檔的副檔名是.transform,只要將準備好的config的檔名後方加上.transform即可,如果是要轉換web.config,就建立web.config.transform,如果是要轉換app.config,就建立app.config.transform,並加入Package中的Content下,加入的方法有:

 

如果組件可以用在Web或Windows Form,可以同時準備web.config.transform、app.config.transform,這二個檔案,當安裝Package時,會比對目錄下(放在Content下相對於專案根目錄)有沒有扣除.transform檔名的檔案,如果有才做轉換,如果沒有不做轉換也不會在專案中增加檔案。

image

 

安裝與移除Package

有Config專案的Package在安裝上沒有不一樣,使用平常的安裝方法及可,但在移除上可能要注意,因為NuGet Config轉換除了安裝時會合供,移除時會刪除合併,不過只有跟轉換檔相同的element才會刪除,因為安裝後通常會改設定值,應該有些比對不成功,會刪不乾清。

 

參考資料

Configuration File and Source Code Transformations