[.NET] NuGet 技巧之偷天換日

NuGet 真的是所有寫元件的程式設計師應該要好好玩一下的東西,不僅僅是它方便開發人員引用你辛苦開發出來的元件,它也隱藏了一些讓元件開發者能即時修改專案內的資訊,例如組態檔 (configuration file)。

NuGet 真的是所有寫元件的程式設計師應該要好好玩一下的東西,不僅僅是它方便開發人員引用你辛苦開發出來的元件,它也隱藏了一些讓元件開發者能即時修改專案內的資訊,例如組態檔 (configuration file)。

Visual Studio 2010 起引入了一個組態檔轉換 (configuration file tramsformission) 的功能,讓開發人員可針對不同的組態來設定要轉換的組態內容,像是資料庫連線字串或是一些特定環境的設定檔,在編譯的時期將系統的組態檔整合特定環境的組態,合成為最終的結果。NuGet 也借用了這個方法,讓元件開發人員能在專案加入 NuGet 套件時,一併將必要的組態設定加到引用元件的專案的組態檔內,而方法卻是非常簡單。

我們一樣使用 NuGet 的 Package Explorer 來進行,首先先在 Package Content 中加入 content 資料夾:

image

然後在 content 資料夾內加入一個稱為 app.config.transform 的檔案 (不可打錯,否則轉換會失敗),並在 app.config.transform 加入下列的組態內容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <appSettings>
      <add key="MyConfig" value="MyValue" />
   </appSettings>
</configuration>

存檔之後,Package Explorer 看起來應該如下圖:

image

接著再將這個 Package 發行到 NuGet (注意,版本必須和先前發行的不同),然後新增一個要加入元件參考的新 Windows 或 Console 專案,並在 NuGet GUI 或是 Package Manager Console 下安裝指令,套件安裝完後,打開 app.config 看,應該會看到新加入的組態內容。

加入前的 app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

加入後的 app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="MyConfig" value="MyValue" />
  </appSettings>
</configuration>

這個方法在 ASP.NET 專案也適用,只要將 app.config.transform 改成 web.config.transform 即可,而且同一個 NuGet 套件可以同時存在 app.config.transform 與 web.config.transform,所以不用怕會有衝突。

除了組態檔以外,我們還可以在 NuGet 套件中加入範本程式碼,讓 NuGet 在安裝套件時將程式碼自動加入到專案內,不過因為每個專案的命名空間都不同,所以程式碼的命名空間必須修改為 $rootnamespace$,如下範例:

namespace $rootnamespace$
{
   public class MyObject
   {
       public string MyProperty { get; set; }
   }
}

如果要在 NuGet Package Explorer 中加入程式碼,在 Package Content 中的 content 資料夾中加入 [filename].cs.pp 檔案,並將範本程式碼加到該檔案內,加入完成後看起來會像:

image

然後發行這個套件,並在要加入這個套件專案中安裝或更新這個套件,會發現在 NuGet 執行完成後,會多了一個程式碼檔案,而程式內容和 [filename].cs.pp 檔案相同,但命名空間已經修改為和引用元件的專案相同。

 

Reference:

http://docs.nuget.org/docs/creating-packages/configuration-file-and-source-code-transformations