NuGet是什麼?為什麼.NET專案中會有NuGet?如何使用NuGet程式包?

語言: CN / TW / HK

概述

大家好,我是專注.NET開發的碼友網建立者 Rector

在.NET應用程式程式設計開發中,開發者通常使用類庫來管理、維護屬於同一分類的程式程式碼,以便程式碼的重用。一般情況下,處於同一類庫的所有類都位於同一程式集。

這些類庫被編譯器編譯後會生成副檔名為 .dll 的動態連結庫檔案,你可以在其它專案中通過引用的方式匯入這些 .dll 程式集並使用其中被封裝的類及成員。

但隨著專案越來越大、越來越多,使用手動引用 .dll 動態連結庫的方式讓程式包管理和維護變得非常困難。在這種情況下,NuGet程式包管理工具便應運而生。

NuGet程式包就好比前端開發中的 npm 包,Java開發中的 Maven 或者 Gradle ,它們都是管理自己語言領域的程式依賴包的工具。負責控制程式包版本,維護包與包之間的依賴,有了包管理工具,你可以快速地安裝包,還原包等。

在正式接觸NuGet程式包工具前,先來一步一步回顧.NET專案中程式包引入的進化歷。

引入程式集的方式

引入程式集的方式有多種,如:

.dll

1.引用專案方式

假如當前有一個名為 NugetDemo.Payment 的類庫專案和一個名為 ConsoleApp 的控制檯應用程式,現需要在 ConsoleApp 專案中通過引用專案的方式引入 NugetDemo.Payment ,方法如下:

1.右鍵單擊 依賴項 ,點選 新增專案引用 ,如圖:

2.在彈出的 引用管理器 視窗中選中 NugetDemo.Payment ,點選 確定 ,如圖:

3.Visual Studio將把選中的專案新增到當前專案的 依賴項 -> 專案 列表,如圖:

2.瀏覽檔案方式

還是在 ConsoleApp 專案中,假如有另外一個支付寶的程式集,如圖:

1.還是按歸引用專案的方式,右鍵單擊 依賴項 ,點選 新增專案引用

2.在彈出的 引用管理器 視窗選中 瀏覽 ,如圖:

3.再點選右下角的 瀏覽 按鈕,在檔案資源管理器中找到剛才準備的 Ali.Alipay.dll 檔案,如圖:

4.選擇後點擊右下角的 新增 按鈕,將自動回到如下介面:

5.選中剛才瀏覽的 Ali.Alipay.dll ,最後點選右下角的 確定 按鈕,Visual Studio將會把這個.dll檔案新增到當前專案的 依賴項 -> 程式集 列表中,如圖:

無可厚非,以上的兩種引用程式集的方式在結果上是沒有問題的。但這種方式只適合個人專案,當你的團隊成員或者團隊專案達到一定量級之後,程式集的管理、維護、版本控制等問題會讓你頭疼。

到最後,你可能不知道當前引用的程式集是哪個版本?在哪裡可以找到正確的程式集版本?它們之間的依賴關係是怎麼樣的?如果共享程式集?

有了NuGet程式包之後,這些問題就迎刃而解。

NuGet程式包

NuGet程式包是微軟為.NET(包括.NET Core)平臺提供的程式集共享包。

簡單地說,NuGet包是一個副檔名為.nupkg的ZIP檔案,其中包含了已編譯程式碼(.dll)與該程式碼相關的其他檔案,以及包版本號等資訊的描述資訊。

開發人員可以建立程式碼共享的程式包並將其釋出到公共或私有主機。包使用者從合適的主機獲得這些包,將它們新增到他們的專案中,然後在他們的專案程式碼中呼叫包的功能。然後NuGet自己處理所有中間細節(包括安裝、解除安裝、依賴關係維護,版本控制等)。

微軟官方為公共的.NET共享程式包提供專門的公有託管服務,地址為: https://www.nuget.org/

目前有超過25萬的程式包被分享在這裡,如圖:

NuGet除了支援公共的nuget.org主機外還支援私有主機,所以你可以搭建個人或者公司內部的NuGet私有伺服器,以達到內部分享程式包的目的。

NuGet程式包的安裝和解除安裝

管理NuGet程式包的方式有多種,其中最常用的分別為:一、通過NuGet包管理器;二、通過命令列管理。其中NuGet包管理器是Visual Studio或者Rider這樣的整合開發環境才具備的客戶端管理工具。

下面以Visual Studio 2022 預覽版(17.0.0 Preview 3.1)為例演示。

NuGet包管理器

安裝NuGet

假如當前有一個基於.NET 5的控制檯應用程式,結構如下:

現需要在這個控制檯中安裝 Newtonsoft.Json 以便進行json序列化和反序列化操作。那麼,我們可以通過右鍵 依賴項 -> 管理NuGet程式包 來開啟NuGet包管理器,如下圖:

然後選擇 瀏覽 選項卡,並在搜尋框中鍵入關鍵詞,在搜尋結果中選中需要安裝的程式包,最後點選右側的 安裝 按鈕,如下:

在彈出的對話方塊中,點選 確定 按鈕:

Visual Studio將自動下載選中的程式包及其依賴包,並將其新增到當前專案的依賴項中,如下圖:

現在,可以在這個 ConsoleApp1 專案中呼叫 Newtonsoft.Json 元件所有可訪問的功能了,以下示例演示了利用 Newtonsoft.Json 將一個json字串反序列化成實體物件,程式碼如下:

using Newtonsoft.Json;

class Program
{
    static void Main(string[] args)
    {
        // 模擬一個JSON字串
        var json = "{\"id\":1,\"name\":\"Rector\",\"age\":18}";
        // 呼叫JsonConvert.DeserializeObject<T>()泛型方法反序列化
        var person = JsonConvert.DeserializeObject<Person>(json);
        Console.WriteLine(person.ToString());
        Console.ReadKey();
    }
}
/// <summary>
/// 定義一個與JSON字串欄位匹配的實體類
/// </summary>
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public short Age { get; set; }
    /// <summary>
    /// 重寫ToString()方法
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        return $"id:{Id},name:{Name},age:{Age}";
    }
}

執行結果如下圖:

NuGet包版本管理

NuGet包有版本之分,不同的版本以版本號作為標識,比如上面安裝的 Newtonsoft.Json 程式包,安裝的時候選擇了當前的最新版本(13.0.1),如圖:

這個下拉列表列出了 Newtonsoft.Json 程式包所有可用的版本號,通過選擇不同版本號即可安裝不同版本的 Newtonsoft.Json 程式包,也可以通過這個版本下拉列表實現NuGet程式包版本的 升/降級

比如,當前我們已經安裝了版本 13.0.1 ,那麼,選擇任意一個比它版本號小的即為 降級 ,比如這裡選擇降級為 12.0.3 ,點選 更新 按鈕即可完成降級。

同理,選擇任意一個比當前版本號大的版本,即可完成 升級 版本的操作。

問:NuGet包為什麼會有不同的版號呢?

答:NuGet的版本號作為不同版本的標識。一個NuGet包的功能在不斷地完善和擴充套件,每次對NuGet包進行迭代(可能是修復bug,也可能是新增功能),都會為其指定不同的版本號(通常這個版本號是向上累加的),不同版本之間相互獨立、互不影響。

NuGet包解除安裝

有安裝就有解除安裝,假如某個專案不再需要某個NuGet程式包,則可以通過NuGet包管理器中的 解除安裝 按鈕來一鍵解除安裝掉指定的NuGet程式包(其依賴的程式包也會被一併解除安裝),如圖:

解除安裝 Newtonsoft.Json 包後,上面演示的反序列化示例程式碼在編譯報錯了,如圖:

NuGet命令列

除了NuGet包管理器外,還可使用NuGet命令列來安裝。

首先,開啟NuGet的官網: https://www.nuget.org/ ,在搜尋框中鍵入要查詢的NuGet包關鍵字(這裡演示Newtonsoft),點選 搜尋 按鈕,如圖:

在搜尋結果列表中點選符合要求的程式包( Newtonsoft.Json ),如圖:

進入到 Newtonsoft.Json 的詳情頁面,此頁面展示了程式包的詳細資訊,如:命令列、依賴、被其他專案使用列表,歷史版本列表,基本資訊等等,如圖:

程式包管理器控制檯命令

安裝NuGet包

首先,演示程式包管理器控制檯,複製其中的程式包管理器控制檯命令:

Install-Package Newtonsoft.Json -Version 13.0.1

在Visual Studio中,開啟 程式包管理器控制檯 ,如圖:

將命令貼上在 程式包管理器控制檯 中,並將 預設專案 設定為當前專案(如果一個解決方案中有多個專案時,需仔細檢查此下拉框選中的專案),按 回車 鍵執行命令。

命令執行結果如圖:

程式包管理器控制檯命令方式安裝NuGet程式包成功。

更新NuGet包

程式包管理器控制檯 中,同樣可以更新NuGet包。

你可以獲取檢查當前專案已安裝包是否有新版本,命令如下:

Get-Package -updates

更新指定包到指定版本,命令如下:

Update-Package Newtonsoft.Json -Version 13.0.1

更新專案的指定包到指定版本,命令如下:

Update-Package Newtonsoft.Json -Version 13.0.1 -ProjectName ConsoleApp1

更新當前解決方案的所有程式包到最新版本,命令如下:

Update-Package

解除安裝NuGet包

程式包管理器控制檯 中,還可以解除安裝NuGet包。

解除安裝預設專案的指定程式包,命令如下:

Uninstall-Package Newtonsoft.Json

解除安裝預設專案的指定程式包,同時解除安裝未使用的依賴包,命令如下:

Uninstall-Package Newtonsoft.Json -RemoveDependencies

強制解除安裝預設專案的指定程式包(即使其他程式包依賴於它),命令如下:

Uninstall-Package Newtonsoft.Json -Force

.NET CLI管理NuGet包

要使用.NET CLI工具,需要安裝.NET Core SDK。如果已安裝Visual Studio 2017及以上版本,則.NET CLI工具會自動安裝。

在使用命令列管理NuGet包時,請在命令列中定位到專案所在根目錄。

安裝Nuget包

使用.NET CLI安裝 Newtonsoft.Json 包的命令如下:

dotnet add package Newtonsoft.Json --version 13.0.1

命令執行如下:

解除安裝Nuget包

解除安裝 Newtonsoft.Json 包的命令如下:

dotnet remove package Newtonsoft.Json

下一篇介紹 《1分鐘極速搭建基於BaGet的輕量級私有Nuget程式包伺服器》

如有什麼問題,歡迎評論區留言反饋。

如果你覺得本文有價值,請來個三連(點贊,收藏,評論)吧,謝謝。