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

RECTOR發表於2021-09-26

本文首發於 碼友網 -- 《NuGet是什麼?為什麼.NET專案中會有NuGet?如何使用NuGet程式包?》

概述

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

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

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

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

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

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

引入程式集的方式

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

  • 程式集在同一個解決方案,直接引用專案
  • 程式集在本地磁碟,瀏覽.dll檔案引入
  • NuGet程式包管理工具安裝

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程式包伺服器》

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

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

相關文章