NuGet系列-程式碼範本支援

有時安裝組件的時候,必需增加一些程式才能正常的執行,NuGet有提供如同Item Template使用ProjectProperties的功能,撰寫組件所需的程式碼,在安裝Package時將其中的變數,轉換成專案的設定值。

有時安裝組件的時候,必需增加一些程式才能正常的執行,NuGet有提供如同Item Template使用ProjectProperties的功能,撰寫組件所需的程式碼,在安裝Package時將其中的變數,轉換成專案的設定值。

 

ProjectProperties

ProjectProperties是定義在專案的資訊,C#是.csproj檔,VB是.vbproj檔,以Xml方式定義,例如下列範例。

image


也可以參考MSDN的ProjectProperties文件,試了一些Property,大部份NuGet都讀不到,只有少數幾個如:

 

source-code transformations

NuGet的原始碼轉換,檔案名稱後方加上.pp,如產生QueryModel.cs檔案,檔名就必需為QueryModel.cs.pp,有一個地方要注意,原始碼轉換不像設定檔轉換相同名稱檔案會合併,當遇到相同名稱檔案,不會出錯,也沒有訊息警告,就忽略了那個檔案,而在移除時會比對內容,內容不同就不會移除檔案,.pp的內容如同Item Template,使用單個 $ 前後將Property包起來,如 $Property$ ,在安裝Packagea時會換成專案的設定值,如果是不支援的Property,會轉成空白。

 

範例

這邊以PrecompiledMvcViewEngine的Package為範例。

 

檔案的配置

image

.pp不一定要放在根目錄,也可以放在子目錄中。

 

.pp檔的內容


using System.Web.Mvc;
using System.Web.WebPages;
using PrecompiledMvcViewEngine;

[assembly: WebActivator.PreApplicationStartMethod(typeof($rootnamespace$.App_Start.PrecompiledMvcViewEngineStart), "Start")]

namespace $rootnamespace$.App_Start {
    public static class PrecompiledMvcViewEngineStart {
        public static void Start() {
            var engine = new PrecompiledMvcEngine(typeof(PrecompiledMvcViewEngineStart).Assembly);

            ViewEngines.Engines.Insert(0, engine);

            // StartPage lookups are done by WebPages. 
            VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
        }
    }
}

範例中使用了 $rootnamespace$ ,在安裝時會換成專案的根命名空間。

 

 

目前原始碼轉換只能單純的文字替換,不能有邏輯處理,只能期待未來的版本可以提供T4來轉換原始碼。

 

參考資料: