共享你的控制項 用NuGet包裝自己的控制項

2021-09-08 11:41:05 字數 4202 閱讀 3374

在當前的開發中,nuget的使用已經有了不小的地位,特別是應用.net core的uwp開發裡,模組化的平台本身更是直接依賴於nuget這一包管理器。

有時自己開發了乙個不錯的控元件,想通過nuget與廣大開發中分享,以享受包管理器快捷、模組化的優勢,該如何做呢?本文將就基本的uwp控制項的開發與打包,來為大家介紹uwp與nuget配合的過程。

對於uwp應用來說,portable類庫、普通的uwp class類庫以及windows runtime元件庫,都是可以接受的,但是這裡推薦大家使用windows runtime另外,就不得不提到一些為了能讓控制項更易使用所需的準備。之前我們開發了pulltorefresh.uwp這一控制項,並且通過nuget包的形式放出。後來我們慢慢地注意到這一控制項會使得visual studio中的xaml設計器無法正常工作,為此我們進行了一些探索,得出的經驗就是:對於新編寫的控制項,需要考慮到xaml框架的布局問題。

xaml控制項框架,由measure和arrange兩個步驟貫穿始終,諸如sizechanged等事件都是這兩個步驟的產物。而vs的xaml設計器在分析開發者編寫的xaml檔案時,也是著重考慮這兩個標準的布局流程的。至於loaded,sizechanged等等事件,如果控制項編寫者把布局操作置於其中(雖然方便,但實際上還會引發新一輪布局,可能影響效能),而且設計器有時會考慮不到,導致設計器表現異常(控制項外觀改變,甚至設計器崩潰)。

xaml的標準控制項自不必說,設計器可以很好的解析它們的xaml布局(在generic.xaml中)以及它們提供的measure和arrange過程。這也是大家能在xaml設計器中看到grid按我們的定義分割行列,stackpanel自動以棧式排布子項的原因。如果大家的新編寫的控制項著重於業務,比如完成一定的計算後更新文字顯示,也無需擔心這些。但是,如果控制項更傾向於提供某種布局方案,就不能不考慮這一點了。所以考慮到有時部分實現會導致引用控制項後,設計器工作不正常,編寫控制項時應盡量使用measure/arrange來編寫複雜布局過程,而不是依賴布局事件。(當然簡單的實現完全可以在事件中實現)

一般情況下,乙個metro控制項會帶上零零散散一堆檔案,xaml布局啊code-behind啊,控制項還分自定義和模板的……

為了讓nuget包能在引用者的專案裡正常工作,需要按正確的結構組織編譯出的種種控制項檔案。為了方便這一過程,visual studio提供了乙個選項,在控制項專案的屬性——生成(build)頁中,勾選「generate library layout」,如圖:

這之後再build,就會在輸出目錄裡組織出正確的包結構了。(當然需要在release也進行這一配置)

另外,需要特別注意的一點,就是*.rd.xml檔案[2]。有時專案中會存在這一檔案(在根目錄\properties資料夾下),並且在引用者專案處於release配置下,需要呼叫本地.net native工具鏈時,可能會需要這一檔案。如果不把它也放進包中,有時會導致引用者專案編譯失敗。這一檔案需要特別處理,我們用nuget打包章節再說。

打包的第一步就是獲取nuget程式:

同時,需要乙個配置檔案來說明當前的包資訊,即nuspec配置檔案。接下來本文用pulltorefresh.uwp這一控制項包來舉例,此例中配置檔案命名為pulltorefresh.uwp.nuspec。其最基本的格式如下:

xml version="1.0"

?>

<

package

>

<

metadata

>

<

id>pulltorefresh.uwp

id>

<

version

>0.3.4

version

>

<

title

>pulltorefresh.uwp

title

>

<

authors

>ms-uap

authors

>

<

owners

>ms-uap

owners

>

<

projecturl

>

projecturl

>

<

requirelicenseacceptance

>false

requirelicenseacceptance

>

<

description

>generic pull down to refresh implementation for uwp.

description

>

<

>

uwp xaml

br#metadata

>

package

>

當然還有別的辦法建立這個檔案,比如從程式集建立、直接和專案關聯等等。這裡我們採用最簡單的方法,其他方法可以參見nuget的幫助文件[3]。

然後我們需要在nuspec所在的資料夾裡建立一些目錄,用來表示nuget包支援的平台:

.\lib\uap10.0就表示uwp平台了。

然後把最初vs生成的檔案拷貝到.\lib\uap10.0裡。

對*.rd.xml的特別處理

首先需要在build出的專案名資料夾(.\lib\uap10.0\pulltorefresh.uwp)裡建立乙個properties資料夾,並把rd.xml檔案放到那裡(如果有這個檔案的話)。

全部完成後,待打包的檔案 總的結構如下:

│  pulltorefresh.uwp.nuspec

│└─lib

└─uap10.

0│ pulltorefresh.uwp.pri

│ pulltorefresh.uwp.winmd

│└─pulltorefresh.uwp

│ pulltorefresh.uwp.xr.xml

│├─properties

│ pulltorefresh.uwp.rd.xml (需要額外處理)

│└─themes

generic.xbf

最後在nuspec所在的資料夾裡,用命令列執行「nuget pack pulltorefresh.uwp.nuspec「,就會在當前目錄生成乙個nuget包了!然後就可以在nuget的**上將其上傳了。

更多資訊還是需要參見nuget目錄結構說明[4]。

p.s. 因為native的dll必須被拷貝到執行檔案目錄裡去,除了通過runtimes目錄自動完成複製,還能通過在build目錄裡新增msbuild配置檔案,比如通過這樣的方式告訴編譯器 平台相關的檔案在哪:

<

target

name="***" beforetargets

="resolveassemblyreferences"

>

<

itemgroup

condition

=" '$(platform)' == 'x86' or '$(platform)' == 'x64' or '$(platform)' == 'arm'"

>

<

reference

>

<

hintpath

>包含$(platform)的路徑

hintpath

>

reference

>

itemgroup

>

target

>

對於通常用c#編寫的庫,因為是託管**,我們可以直接將其配置為生成anycpu型別的程式集或winrt元件,並將編譯出的檔案直接置於lib\uap10.0\下。我們的pulltorefresh.uwp例子就是如此。[2] runtime directives (rd.xml) 配置檔案:

[3] nuget建立包:

[4] nuget目錄結構說明:

自己用的日曆控制項

var striframe with webcalendar.iframe function webcalendar 初始化日曆的設定 var webcalendar new webcalendar function calendar 主調函式 o.display webcalendar.ifram...

你的課Facebook群控比較適合哪些使用者進行選擇

想要把產品放在國際市場當中來進行宣傳和銷售,是很多商家比較想要達到的一種產品銷售方式。畢竟有很多的產品在國內已經開啟了產品的銷售市場,但是想要開啟國際銷售市場,卻總是沒有辦法,能夠通過更簡單成本更低的方式來達到這樣的目的。現在有很多的商家會發現利用facebook可以進行產品的宣傳,只要在宣傳時,能...

13 用別名(alias)建立你自己的命令

現在是時候,感受第一次程式設計經歷了!我們將用 alias 命令建立我們自己的命令。但在 開始之前,我們需要展示乙個命令列小技巧。可以把多個命令放在同一行上,命令之間 用 分開。它像這樣工作 command1 command2 command3.我們會用到下面的例子 me linuxbox cd u...