NuGet是什么?理解与使用(上)
如果你了解python,那么它類似pip。
如果你了解nodejs,那么它類似npm。
如果你了解ruby,那么它類似gem。
對,它就是一個包(package)管理平臺,確切的說是 .net平臺的包管理工具,它提供了一系列客戶端用于生成,上傳和使用包(package),以及一個用于存儲所有包的中心庫即NuGet Gallery,如果有需要也可以搭建自己的私有NuGet庫。
NuGet 官方?www.nuget.org
?
對于一個現代化的開發平臺,建立一種讓開發者創建,分享與使用可復用代碼的機制是十分必要的。這種“可復用代碼”被打包后的文件通常被稱作“包”(package),對于.NET(包括 .NET Core)平臺來說這個機制的實現就是NuGet平臺。
NuGet的實現均為開源項目,包括了客戶端工具,服務器,官方網站以及各語言的文檔等。 這些項目可以在下面的鏈接中找到。
NuGet on GitHub?github.com
?
NuGet包的本質是一個以nupkg為后綴的zip壓縮文件(你可以將后綴改為.zip后解壓查看里面的內容),其中包含了編譯后的Dll文件以及其他相關文件。下圖顯示nuget包從創建,上傳到被使用的流程。
NuGet的客戶端融合在各類開發工具中,包括但不限于:
nuget客戶端工具
在了解了nuget大致概念后我們可以通過發布一個nuget包來更仔細的了解如何使用nuget以及其中的重要概念。
下文會以開發中最常接觸到的Visual Studio( 本文使用Visual Studio 2017 Community )做為演示工具來創建一個nuget包。要創建一個包首先需要一個 .net項目,可以看到項目的創建頁面有很多選擇,類庫項目就可以選擇三種(.net core的類庫項目未顯示在截圖中) .Net Core;.Net Framework 還有 .Net Standard,到底應該選擇哪一種呢?
Visual Studio 2017 項目創建窗口
為了做出選擇,我們首先要深入理解TFMs和 .net standard這兩個概念。首先創建一個 .net core類庫項目。
.net core類庫項目結構
在項目目錄中打開csproj文件可以看見下面的內容。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netcoreapp2.0</TargetFramework></PropertyGroup></Project>可以看到該項目的TargetFramework為netcoreapp2.0,這里的netcoreapp2.0 就是TFMs,即Tagrget Framework Monikers 翻譯過來就是“目標框架別名”,這個值指定了這個項目是跑在哪個Framework上的。
如今 .net平臺有各種版本的Framework,在 .net core之前有 .Net Framework 1.0一直到現在的4.7等等各種版本, .net core現在有1.0/1.1/2.0/2.1。所有這些版本都有自己的代號/別名。全部的TFMs可以在下面的鏈接找到。
Target frameworks?docs.microsoft.com
這仍然沒有解決我們的問題:如何決定使用哪個Framework?現在需要引入 .Net Standard,它是一個標準, .net API的標準,用來描述每個Framework的API實現情況。標準的版本越往后支持的API就越多,也就兼容了之前的版本。
當前各個Framework的 .Net Standard版本如下圖(如果你曾經了解Portable Class Libraries(PCL),它已經被 .net standard替代了,所以這里不多做說明。):
最新的內容可以在下面的鏈接中找到。
dotnet/standard?github.com
?
所以要選擇哪個Framework,首先要確定的是:1)你的項目要使用哪些API?2)你項目要兼容哪些Framework? 總的來說:
所以 .net standard的選擇原則就是:在API夠用的情況下選擇盡量低的 .net standard標準。這需要根據實際的項目需求來進行判斷。
了解了TFMs和 .net standard后我們繞回來說NuGet,創建一個 .net standard 2.0 類庫項目。
打開csproj我們可以看到
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework></PropertyGroup></Project>可以看到TargetFramework是netstandard2.0。如果我們需要更改TargetFraamework,可以選擇項目【屬性】在【應用程序】頁面可以進行更改。
目標框架修改
為了演示我們為項目添加一個第三方包Newtonsoft.Json,右鍵點擊項目選擇管理NuGet程序包。
打開后可以在Visual Studio左側看到下面的界面。
這里顯示了項目已安裝的包,這個包由我們選擇的Target Framework隱式引用的?,F在我們點擊瀏覽,搜索Newtonsoft.Json。
120M的下載量,可見現在json的流行程度
點擊安裝。
安裝完成后可以看到程序包管理器輸出以下信息,并且引用中也添加了新的項目。
但是我并沒有在項目文件夾下找到任何Newtonsoft.Json的程序集,包在哪?其實包被下載到了一個nuget公共目錄,在我的Windows10系統上是 C:\Users\wangl\.nuget\packages,這樣nuget包就不會被重復下載。而在項目中nuget僅僅將依賴信息寫入了csproj項目文件與obj文件夾中的project.assets.json,其中csproj項目文件中的內容如下。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="11.0.2" /></ItemGroup></Project>包所依賴的內容并不會被打包到最后的.nupkg文件中,NuGet只是將依賴信息寫入包,在最終使用這些包的應用程序編譯時還原所有的依賴。
至此我們簡單了解了NuGet給項目添加引用的過程。對于更復雜情況的引用,如下圖
項目引用示例
這個項目的依賴樹中有三個對B包的引用,而三個包的版本要求可能是不相同的,但幸好我們只需要關心我們項目直接引用的包,因為Nuget會幫我們管理所有包的依賴并且對于被多次引用的包,Nuget會找出滿足該包所有使用者的版本(不過因為版本要求沖突而找不到適合包的情況是有可能的)。如果需要更詳細的了解nuget如何解析項目包的引用可以前往下面的鏈接。
NuGet Package Dependency Resolution?docs.microsoft.com
現在開始打包我們的類庫項目,首先要為包設置一些諸如版本,作者等相關信息。右鍵點擊項目選擇【屬性】,再選擇【打包】頁,可以在這里輸入包的描述信息。
打開csproj項目文件,可以看到這些信息也是保存在其中的。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><ApplicationIcon /><OutputType>Library</OutputType><StartupObject /><Authors>FishNo6</Authors><Company>FishNo6</Company><Product>DemoPackage</Product><Version>1.0.1</Version><AssemblyVersion>1.0.0.1</AssemblyVersion><FileVersion>1.0.0.1</FileVersion><Description>This package is a demonstration for Nuget package.</Description></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="11.0.2" /></ItemGroup></Project>填寫好信息后保存?;氐浇鉀Q方案,右鍵點擊項目選擇【打包】,可以看到以下輸出。
1>------ 已啟動生成: 項目: FishNo6.DemoPackage, 配置: Debug Any CPU ------ 1>FishNo6.DemoPackage -> E:\labs\FishNo6.DemoPackage\FishNo6.DemoPackage\bin\Debug\netstandard2.0\FishNo6.DemoPackage.dll 1>已成功創建包“E:\labs\FishNo6.DemoPackage\FishNo6.DemoPackage\bin\Debug\FishNo6.DemoPackage.1.0.1.nupkg”。 ========== 生成: 成功 1 個,失敗 0 個,最新 0 個,跳過 0 個 ==========在對應目錄就可以找到nupkg包文件了。如果你的電腦安裝了NuGet Package Explorer可以直接雙擊打開包來查看信息,這個應用可以在Window Store中安裝。
到此我們成功創建了一個NuGet包。
下篇內容包括如何將包上傳到NuGet Gallary(NuGet官方庫)以及更深入的了解NuGet平臺。
?
最后附上NuGet官方文檔。
NuGet Documentation?docs.microsoft.com
本文的目的是記錄與分享自己的學習過程和個人你的看法。如果對你有任何幫助深感榮幸,若有任何紕漏煩請指正。如有任何問題請在評論里留言,我會盡量解答。
總結
以上是生活随笔為你收集整理的NuGet是什么?理解与使用(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Syslog 连接外部解决方案
- 下一篇: 不印钱了?美联储资产负债规模连续两周下滑