改寫 .NET Core 後逐漸感受到與 .NET Framework 專案的差異,例如:程式庫一樣是透過 NuGet 安裝及更新,但 .sln 目錄下熟悉的 packages 資料夾不見了。

Visual Studio 建立 .NET Framework 專案時,會將下載的 NuGet 程式庫放在 .sln 所在目錄的 packages 資料夾,專案參照 DLL 時則以相對路徑指向它。因此當專案目錄結構調整,.csproj 裡的 HintPath 需配合修改,例如從 ..\packages 改成 ..\..\packages。另外,若 Build 主機無法上網下載 NuGet 或想節省重新下載時間,packages 目錄也需簽入版控主機。盤點舊文,NuGet packages 眉角還真不少:

NuGet Package 集中放在 .sln 的 packages 雖可做到同解決方案所有專案共用,但跨不同 .sln 時即有重複儲存的問題,依實務經驗 packages 目錄 500 MB 起跳是家常便飯;TFS 若採 TFVC 版控,每切一個分支得複製整個 .sln 目錄,磁碟空間當場加倍,常是造就「原始程式碼不就是堆文字檔,怎麼會好幾 GB?」的元兇。

.NET Core 專案改變做法,不再將 NuGet Package 保存在解決方案或專案的 packages 資料夾,而是改用全域式儲存,以 Windows 為例,預設會放在 %userprofile%\.nuget\packages:

預設每個使用者只需儲存一份,所有專案共用,相較於之前每個解決方案一份省下可觀的儲存空間。不過,也因為它是所有專案用過 NuGet Package 的總和(含新舊版本),耗用磁碟空間也十分可觀,像在我的筆電就有 6GB:

如果一台電腦由三位開發者共用(實務上好像比較少這種狀況),這個容量要再乘以三,就更驚人了。

若有需要,我們可以指定 global-packages 目錄,有幾種方法:

  • 用環境變數 NUGET_PACKAGES 指定位置 (優先權最高,可覆寫其他設定)
  • 在 nuget.config 設定 globalPackagesFolder 或 repositoryPath 參考
  • MSBuild 的話可指定 RestorePackagesPath 參考

除了節省多人共用環境的儲存空間,自動化編譯時也常需要與使用者無關的獨立 packages 目錄,可透過以上方式設定。

【延伸閱讀】

Information of .NET Core NuGet packages folder location.


Comments

# by 小黑

請教黑哥, 在.net framework 的時代,release 相關應用程式時,可以輸出應用程式會用到的組件,而客戶僅需要安裝對應的 target framework 即可正常執行,不知.net core 這邊有所差異嗎?

# by Jasonlhy

這個功能叫 package reference 不是 .net core 獨有的 而且整合在 msbuild 15 中 (VS 2017) .net framework 也可以用 PackageReference

Post a comment