Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

建立自己的Library - 使用Nuget Package Explorer (GUI) 建立nuget package (上篇) 介紹package結構

2016-04-14 Thursday

在上一篇 (何為nuget,該如何使用,和2.7版本之後建議的回覆nuget package(套件)的方式) 介紹如何使用nuget後,應該會發現要在專案裡面使用某個Library實在是很方便,同個Library在不同專案使用只要透過nuget安裝就搞定。

作為開發者,相信大家都有一些小工具或者一些方法是常常被使用到的,而每次不同專案要使用,都需要copy整個程式碼實在很不方便,更別說如果哪天發現有bug ,要更新所有有用到的專案就更加困難和浪費時間。

如果可以把自己的小工具包成一個nuget就超級方便了,而且要更新程式碼也很容易,更棒的是要把nuget放到微軟的nuget.org網站上面是完全免費,不好好利用就太浪費這個服務了。

在這篇,將會介紹如何使用nuget package explorer來先了解package的結構,並且之後在用這些知識來建立自己package。

NuGet Package Explorer(NPE)

Nuget Package Explorer (之後會用縮寫NPE稱呼) 是一個 GUI工具可用來建立和看 .nupkg (nuget package的檔案Extension)的工具。

Nuget Package Explorer

  • 原始碼:Github
  • 下載:位置
  • 特色:可以打開和建立package,並且在看某個package的時候,可以直接點兩下打開檔案內容

在建立自己的nuget package之前,我們先來看一下別人的nuget package長什麼樣子,並且了解一些nuget package特殊資料夾的作用,這樣對於等一下建立package更有概念。

用NPE看看一些package - 了解package內容的結構

任何package的根目錄最多四個,分別是:libtoolscontentbuild

我們將透過看幾個package來了解4個資料夾不同之處。

把NPE執行起來之後,可以看到可以:打開本地的package、可以打開nuget上面的package、建立package和打開nuget documentation。

image
NPE執行起來的畫面

在這次我麼將會打開線上nuget,看看這兩個package:Newtonsoft.JsonJquery package。先從打開Newtonsoft.Json開始。

image

image

打開Newtonsoft.Json Package

我們會看到畫面有左右兩個視窗,其中左邊屬於package meta資訊(稍後介紹),右邊則是package內容。這個部分是目前的重點。

我們可以看到 總共有兩個資料夾libtools。其中lib下面有不同的資料夾可以看出是.Net Framework版本

lib 資料夾的作用

lib在nuget裡面來說,放的都是會被專案直接Reference的dll檔案

像我們nuget install進來一個package的時候,我們不需要手動Reference下載的Dll,而是nuget自動幫我們 Reference。nuget如何知道什麼是屬於要Reference的dll?

nuget會看lib下面的資料夾,找到符合目前專案的target 的 .net Framework dll去做Reference。由此,我們可以看到Newtonsoft.Json基本上支援所有.ent 專案,從.Net2.0到 portable library。

tools 資料夾的作用

tools資料夾主要作用是放一些powershell script 和工具類型的東西。有特殊的ps1檔案能夠在nuget 不同時間(例如剛安裝的時候,或者解除安裝的時候)被執行

舉例來說,Newtonsoft.Json 就有一個tools\install.ps1。這個install.ps1的內容會在安裝這個套件的時候被執行。

以Newtonsoft.Json來說,安裝完會直接打開Visual Studio 頁簽到Newtownsoft.Json的官網 - 這個邏輯完全是因為install.ps1裡面有這樣寫所以才執行。

package的檔案都可以點兩下打開看內容,甚至檔案內容還有語法高亮哦

image
打開install.ps1

content 資料夾的作用

content 放的內容就是要加到專案裡面的檔案。最好的例子就是一些javascript類型的package。

我們打開Jquery的package,我們會看到他沒有 lib 資料夾,裡面有的是 content。

image
打開Jquery package的內容

content的概念是,content以下的資料夾就是對應到專案的根目錄。安裝這個package的時候,會自動把content下面的內容copy到專案更目錄。

以jquery套件來說,安裝之後,從根目錄會有一個資料夾Scripts被建立出來,然後4個js也被copy進去。

因此,content以下檔案和資料夾屬於非dll類型的檔案。

build 資料夾

其實還有一個特殊資料夾叫做build,主要作用是加 MSBuild 的target和property,為你的package加入所需要build時候所需要的特殊邏輯。

用NPE看package的meta資訊

在上面我們用了Newtonsoft.Json和JQuery的套件來了解了package內容的結構和每個內容的特殊之處,不過除了package本身的內容很重要之外,package本身的meta資訊也很重要,例如 package版本,專案網址等和重要資訊,這一段我們就看一下都有些什麼meta資訊。

這次我們打開Asp .Net Mvc的Package可以看到一些資訊,大部分看名稱就知道是什麼,不過有幾個有特殊的地方會分別介紹:

image
打開Asp .Net Mvc看到的內容

Id欄位

Id其實就是這個package的唯一名稱,也是在用Package Manager Console下指令的時候所輸入的那個package名稱。有些package的Id和顯示名稱 (Title) 是不一樣的

舉例我們之前看的Newtonsoft.Json是id,但是他的Title則是 Json.Net,而在安裝package的時候,UI顯示的是Title,但是Package Manager Console用的

又是Id,因此兩者不一定要一致導致有時候會搞混。

Version欄位

version就是目前這個package對應的版本。其中有件事情要注意,當某個package發佈之後,不能更新同個版本的package,只能夠更新新的版本。

舉例,建立一個版本0.1.0然後發佈上去,你不能更新0.1.0的package內容,而是只能夠發佈新的版本來達到更新效果,而不能改之前已經發佈的內容。

版本結構 Semantic Version 2.0

基本上nuget是遵從Semantic version 2.0(完整規範)的方式來定義版本,其中定義了版本格式為 Major.Minor.Patch

  • Major - 當更新回影響現有api導致使用方式不同的時候,這個數字會變動
  • Minor - 當有增加新的api/功能,但是不影響目前使用,這個數字會變動
  • Patch - 屬於不會變動api的bug fix

版本還可以定義為Pre-relase的package,就是在Patch後面加上-就可以 - 以Asp .Net mvc Package來看,6.0還在Pre-Release

Dependency 欄位

nuget package的好處之一是幫忙處理package之間的dependency。在這個欄位定義這個package會用到哪些其他nuget package和使用哪些版本

如果Dependency欄位在往下一點,可以看到 Framework Assembly Reference,這些是說明那些.Net Framework的library會用到。

結語

在這篇介紹了NPE這個工具,並且介紹了package的結構。有了對於package的結構的基本知識,在下一篇,將會用這個知識搭配NPE來建立新的package。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
2016-04-14 Thursday
comments powered by Disqus