.net 知新:【4】NuGet簡介和使用

XSpringSun發表於2021-08-11

在包管理以前我們在專案中引用第三方包通常是去下載dll放到專案中再引用,後來逐漸發展成各種包管理工具,nuget就是一種工具,適用於任何現代開發平臺的基本工具可充當一種機制,通過這種機制,開發人員可以建立、共享和使用有用的程式碼。 通常,此類程式碼捆綁到“包”中,其中包含編譯的程式碼(如 DLL)以及在使用這些包的專案中所需的其他內容。
Linux 我們可以使用apt、yum來安裝軟體,js 可以使用npm來搭建下載,Java 有maven管理包,而對於.net nuget就是同樣效果和機制的工具。

NuGet 客戶端工具

要使用 NuGet,作為軟體包使用者或建立者,可以使用命令列介面 (CLI) 工具以及 Visual Studio 中的 NuGet 功能。

CLI工具可以使用 dotnet CLI 或 nuget.exe CLI。

dotnet CLI 隨某些 Visual Studio 工作負載一起安裝,例如 .NET Core 。從 Visual Studio 2017 開始dotnet CLI 將自動隨任何與 .NET Core 相關的工作負載一起安裝。
dotnet CLI 適用於 .NET Core 和 .NET Standard 專案(SDK 樣式的專案型別),以及任何其他 SDK 樣式專案(例如,面向 .NET Framework 的 SDK 樣式專案)
也就是說安裝VS的時候會自動包含在工作負載中,對於.net 5 也可以直接安裝.NET SDK,如之前.net 知新:【1】 .Net 5 基本概念文章介紹中可以看到.NET SDK是包含了CLI的。
而對於.NET Framework(僅限非 SDK 樣式專案),使用 nuget.exe CLI。這種方式現在基本不使用,因為我們一般不會去單獨安裝,都是安裝VS後直接使用就行了,除非你還在使用Visual Studio 2017 以前的版本。

至於他們有什麼區別呢?

第一個是以前.NET Framework時期使用包管理的方式是使用單獨的 packages.config 檔案進行管理。

但是不建議使用packages.config,.NET Framework可以在VS中右鍵點選packages.config遷移到PackageReference。

現在.net 5的專案預設使用 PackageReference,包保留在 global-packages 資料夾中(而不是解決方案中的 packages 資料夾中)。
PackageReference 僅列出那些直接安裝在專案中的 NuGet 包,不會顯示引用包所包含的低階依賴更加簡潔。

比如我們使用nuget安裝NPOI包,它的依賴如下:

在.net framework的packages.config檔案中看到NPOI和它的依賴項

在.net 5專案檔案中只有NPOI

第二個就是兩個工具的功能有差異

某些高階功能無法使用的時候我們就需要用命令的方式。

visual studio 使用 nuget

在VS裡面有兩種方式管理nuget包。第一種是右鍵專案->管理程式nuget包 進入導UI介面。

可以進行程式包的查詢和安裝的包管理,對包進行解除安裝更新。 在右上角有一個程式包源,可以進行包源設定,設定包源地址。預設是將 NuGet.org 用作 NuGet 客戶端的包儲存庫。
所以我們配置應使用以下 V3 API 終結點:

https://api.nuget.org/v3/index.json

NuGet.org 是 NuGet 包的公用主機,NuGet 技術還支援在雲中(如在 Azure DevOps 上)、在私有網路中或者甚至直接在本地檔案系統以私密方式託管包。
https://www.nuget.org/ 開啟NuGet.org站點可以進行包搜尋和包的上傳等。

另外一種方式就是工具->nuget管理器->程式包管理器控制檯 ,調出控制檯後就可以使用cli命令進行nuget包管理了。
所以有時候我們搜尋文章的時候看到別人新增包,命令dotnet add package Newtonsoft.Json 我們要知道這是nuget包新增,程式包管理器控制檯執行,或者在ui介面搜尋包視覺化操作新增,以前的 nuget.exe CLI新增包是install 命令,要注意區分下。

建立釋出包

首先需要設定屬性,建立包需要以下屬性。

  • PackageId,包識別符號,在託管包的庫中必須是唯一的。 如果未指定,預設值為 AssemblyName。
  • Version,窗體 Major.Minor.Patch[-Suffix] 中特定的版本號,其中 -Suffix 標識預釋出版本。 如果未指定,預設值為 1.0.0。
  • 包標題應出現在主機上(例如 nuget.org)
  • Authors,作者和所有者資訊。 如果未指定,預設值為 AssemblyName。
  • Company,公司名稱。 如果未指定,預設值為 AssemblyName。

在 Visual Studio 中,可以在專案屬性中設定這些值(在解決方案資源管理器中右鍵單擊專案,選擇“屬性” ,然後選擇“包” 選項卡)。 也可以直接在專案檔案 (.csproj) 中設定這些屬性。

在包的 NuGet.org 頁面上所示的包說明可以在 .csproj 檔案中的 設定,或者通過 .nuspec 檔案中的 $description 拉取。
.nuspec 檔案是包含包後設資料的 XML 清單,.nuspec 當你建立包時將生成。

執行 pack 命令

執行dotnet pack 命令會打包解決方案中可打包的所有專案,也可以在專案屬性上設定“在構建時生成NutGet包”。

具有 .nupkg 副檔名的 NuGet 包只是一個 zip 檔案。 若要輕鬆檢視任何包的內容,只需將副檔名更改為 .zip 並按常規方法展開內容。 嘗試將包上傳到主機前,請務必將副檔名改回 .nupkg。
命令執行完成後打包後生成的檔案路徑會顯示在控制檯上,到目錄檢視到ConsoleAppNet5.1.0.0.nupkg 包,並複製一個改成zip驗證。

釋出到 nuget.org

登入到nuget.org,使用 Microsoft 帳戶進行登入,然後選擇upload上傳,選擇了檔案後會進行自動校驗,如果有問題處理後再重新上傳。
還可以通過命令的方式去上傳,但是需要api金鑰,自己去看下官網好了。

相關文章