NuGet是什么?理解与使用(下)
本篇將回答下面幾個問題:
- 如何解讀NuGet Gallery上的包信息?
- 如何上傳NuGet包到NuGet Gallery?
- 如何安裝本地NuGet包?
- NuGet包的內容文件與目錄結構?
如果你沒看過上篇那么它在這里:
6號咸魚:NuGet是什么?理解與使用(上)?
那么開始,
一,如何解讀NuGet Gallery上的包信息?
我們先以Newtonsoft.Json為例,在其NuGet頁面上可以看到如下頁面,其中包含了作者,描述,依賴等等信息。
其中重要的依賴關系(部分)如下,
較大字體顯示內容如.NETFramework 2.0表示Target Framework(目標框架),在Target Framework下面的為此Target Framework對應的依賴,所以用一句話可以解讀為:“如果你項目的目標框架也是.NETFramework 2.0,那么你就不需要依賴任何其它包就可以使用這個包”。同樣的下面.NETFramework 1.0的含義就是:“如果你的項目的目標框架為.NETFramework 1.0那么需要引用下面的包后才能使用該包?!辈贿^這些都不需要你手動去引用,NuGet會在你安裝該包時自動安裝其依賴的包。
Newtonsoft.Json這樣的包是NuGet平臺上的典型,除此之外還有一些比較特殊但也非常重要的包。我們來看一下Microsoft.NETCore.Platforms,下面是這個包的頁面。
可以看到這個包竟然沒有任何依賴,這是因為這個包并不包含任何DLL,所以也不需要依賴任何目標框架,NuGet的包可以包含任何你想發布的文件而不僅僅是DLL程序集。
下面在介紹另一種比較特殊的包,元包(Meta Package), Microsoft.AspNetCore.All就是一個元包 ,下面是它的頁面。
頁面上顯示和普通的包并沒有區別,為了更直觀的演示我們把這個包的nupkg文件下載到本地,解壓后可以看到在其lib目錄下面只包含了一個空文件。
其實這個包本身并不包含內容,它通過對其他包的依賴定義自己。元包是一個NuGet包的約定,描述了一組放在一起有意義的包(Metapackages are a NuGet package convention for describing a set of packages that are meaningful together.)
這樣做的原因首先是因為NuGet的包管理是“細粒度”的,原則上每個程序集(DLL)都應該是一個包,這樣可以帶來以下幾個好處:
- 細粒度的包在開發、測試的過程中與其它包的關聯有限。
- 細粒度的包可以提供對不同操作系統和CPU的支持。
- 細粒度的包可以只依賴某個特定的庫。
- 在發布應用時,未被引用的包不會成為應用的一部分,因此應用程序的體積會有更小。
但是對于某些情況,元包則有更多好處:
- 在引用大量細粒度包時有更好的用戶體驗
- 定義了一組經過測試且運行良好的包(包括指定的各種版本)
而下面這個元包比較特殊:Microsoft.NETCore.App,因為它不僅是元包也定義了框架,也就是我們項目里的目標框架(Tagrget Framework)。這會在解讀這類目標框架的元包時造成一定的困惑,以 Microsoft.NETCore.App上的頁面為例,因為他本身定義了目標框架。不過我們應該不會手動去引用這些包,這些包通常是在是設置目標框架是被項目隱式應用的。
下面這張圖描述了這種關系:API定義了框架,框架用于元包中包的選擇,而這些包給你提供了API的實現。
?
更多資料可以查看下面這篇文章和其中文譯文,對你理解NuGet平臺和包,元包,框架的設計很有幫助。
Packages, metapackages and frameworks?docs.microsoft.com.NET Core中的包、元包與框架?www.cnblogs.com
二,如何上傳NuGet包?
要上傳NuGet包到NuGet Gallery,首先你需要一個NuGet賬號或者微軟賬號,然后準備好你的nupkg文件就可以開始上傳了。
下面簡單介紹三種方式:
1,在NuGet Gallery網頁上傳包,這是最方便快捷的方式。登錄NuGet Gallery 點擊Upload菜單進入上傳頁面。
nuget gallery包上傳頁面
點擊Browse選擇你的包文件,頁面將讀取你的包信息并顯示在頁面上。
填寫包的文檔相關信息。
填寫包的文檔相關信息
確保所有信息正確后就可以點擊Submit發布你的包了!
2,在NuGet Package Expolrer中上傳包,這個應用可以在Windows Store中免費安裝。在使用該工具上傳包之前你需要一個API Key,因為除使用官方上傳頁面的方式外所有其他方式上傳包都需要使用一個API Key,這個Key可以在官方網站獲取。在個人帳號的下拉菜單中選擇API Keys。
進入API Key管理頁面,點擊如下圖的Create,開始創建一個API Key。
填寫好Key的名稱,過期時間,再選擇該Key可以使用的功能和對應的包,點擊確認成功創建后可以看到如下圖的頁面。
點擊Copy就可以拷貝你的Key到剪貼板。有了API Key之后我們使用NuGet Explorer打開我們的包,在File菜單中選擇Publish.
點擊Publish后出現如下界面。
輸入所需的API Key點擊Publish。
3,使用 .net core SDK命令行上傳包,可以執行dotnet nuget push的命令,其中第一個參數為包所在目錄,若再當前目錄可直接填入文件名, -k參數就是我們在上面所獲取到的API Key,如下面的命令行示例。
dotnet nuget push foo.nupkg -k 4003d786-cc37-4004-bfdf-c4f3e8ef9b3a該命令還有許多其他參數,更多信息可前往下面的鏈接:
dotnet nuget push command - .NET Core CLI?docs.microsoft.com
需要注意的是包上傳后是不能被刪除的,只能被unlist。鑒于此我沒有真的上傳我的包,因為知道一個完全沒有意義的包在我的賬號里還無法刪除會讓我寢食難安的。大家可以自己動手嘗試。
?
三,如何安裝本地NuGet包?
以Visual Studio 2017 Community為例,打開你的項目,右鍵點擊項目選擇【管理NuGet程序包】。
然后點擊NuGet程序包管理界面右上角的齒輪,出現下面的設置窗口。
點擊+號新建一個可用程序包源,設置你想要的名稱并選擇源的所在目錄,點擊確定。
再次打開NuGet程序包器,你可以在程序包源選項中看到看添加的源,選中后就可以看到你在該本地路徑中放置的包了!
四,NuGet包的內容與目錄結構?
我們仍以Newtonsoft.Json包為例,將后綴改為.zip并解壓后可以看到以下目錄結構。
其中lib目錄如下圖,它保存了各個目標框架下對應的程序集。
Newtonsoft.Json.nuspec為xml格式的manifest文件保存了包的元數據,如作者,版本,包含內容等等信息。rels,[Content_Types].xml,package為打包時生成的文件。
除了這些目錄外,包內還可以包含runtimes,content,build,tools等文件夾,下面介紹runtimes和content文件夾。
如果你的程序集對不同的操作系統有不同的實現,你需要將這些程序集按照下面的目錄結構放入runtimes文件夾中。
\runtimes\win10-arm\native\lib\uap10.0\win10-x86\native\lib\uap10.0\win10-x64\native\lib\uap10.0而對于content文件夾,你可以把它看做是目標項目的根目錄,也就是該文件夾下的內容會在包被安裝時拷貝到項目的目錄下。比如包里的content/images目錄在包被安裝之后就會在你的項目目錄下放置一個images目錄。
除了這些主要的文件夾,NuGet包里還可以包含build,tools等文件夾和文件,更多詳細內容可查看下面的文檔。
How to create a NuGet package?docs.microsoft.com
希望本篇能讓你對.net的包管理平臺有基本的了解,利用好NuGet平臺會給你以后的項目開發提供很大的幫助。
最后,如果你有任何問題歡迎在評論,我會盡量解答。
如果喜歡類似的文章,請關注,非常感謝,.net社區的壯大需要大家的努力。
總結
以上是生活随笔為你收集整理的NuGet是什么?理解与使用(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12万买“坦克300” 新款哈弗大狗上市
- 下一篇: ABP入门系列(18)—— 使用领域服务