.NET Core NuGet Package Offline Restore(離線還原)

  • 1786
  • 0
  • 2022-04-16

當程式碼交付到客戶端,有時候建置環境是無法連網的,常常就要一併提供 NuGet 的離線使用方法。

用 .NET Framework 開發時,只要把開發時建置方案根目錄會產生的 packages 資料夾也一起給出去就好了。程式碼直接就能 build 或是把 packages 的內容移到本機的 NuGet Source,又或加到內網自架的 NuGet Server。

但到 .NET Core 方案根目錄就沒有 packages 資料夾了,想辦法把它再生出來問題就解決一大半了

1.匯出

可以用 dontet 的命令把 NuGet 匯出,在方案根目錄開啟 cmd 輸入

dotnet restore --packages .\packages\

執行完,專案參考的 NuGet 包含再相依的套件都會還原一份到 packages 資料夾(和 .NET Framework 專案自動產生的 packages 的檔案擺放結構不同,但實測並沒衝突)。

在 packages 內的檔案,是將 .nupkg 檔解壓後方便快取的形式,可以用指令把內含的 .nupkg 檔複製到同一個資料夾

for /R .\packages %f in (*.nupkg) do copy /Y "%f" .\save_nupkg\

上面的指令把 .nupkg 檔都複製到 save_nupkg 資料夾。以離線還原來說,用 packagessave_nupkg 的效果是一樣。

2.還原

因為新的 NuGet 機制有 Global Cache,在離線環境只想辦法讓 NuGet 套件被 Cache 到,之後建置或發佈就都能自動從 Cache 抓 NuGet 套件到方案了。

程式碼連同 save_nupkg(或 packages)資料夾,移到離線的建置主機後,執行指令

// 還原 NuGet,來源指定 save_nupkg 資料夾
dotnet restore -s .\save_nupkg
// 或還原 NuGet,來源指定 packages 資料夾
dotnet restore -s .\packages

理論上 restore 完,本機全域就會有之前匯出的 NuGet,就可以開始建置或發佈專案了

3.開發環境如何測試

在你的開發環境,大概就算把 NuGet Source 都 disable、電腦也離線、把 bin 和 obj 資料夾都刪了,還是會 build success 吧,NuGet 的 .dll 檔也都會還原到 bin 和 obj 資料夾。

因為 NuGet 有 Global Cache 在 C:\Users\[UserName]\.nuget\packages

你可以清除快取並電腦離線來測試離線環境

dotnet nuget locals all --clear

補充

前述算是一時的作法,若環境整合做好了,就算不能連網也可以架個內網的 NuGet Server 對所有的套件統一管理,這樣把 save_nupkg 或清單交給管理者作審核、上傳即可。