iT邦幫忙

DAY 6
1

發開相關系列 第 6

NuGet系列-程式碼轉換支援

有時安裝組件的時候,必需增加一些程式才能正常的執行,NuGet有提供如同Item Template使用ProjectProperties的功能,撰寫組件所需的程式碼,在安裝Package時將其中的變數,轉換成專案的設定值。
同步發表於:http://www.dotblogs.com.tw/wadehuang36/archive/2011/10/18/nuget-source-code-transformations.aspx

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

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

也可以參考MSDN的ProjectProperties文件,試了一些Property,大部份NuGet都讀不到,只有少數幾個如:
--AssemblyName
--DefaultNamespace
--OutputFileName
--RootNamespace
--等等 少數幾個Property可以用,不過在NuGet最常用的應該只有 RootNamespace吧。

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

範例
這邊以PrecompiledMvcViewEngine的Package為範例。

檔案的配置

.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來轉換原始碼。


上一篇
NuGet系列-製作安裝Package時自動設定Config
下一篇
[ASP.NET MVC]Razor Views 預編譯(Pre-Compile)[1]-加快第一次執行回應速度
系列文
發開相關7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言