如何修改NuGet預設全域性包資料夾的位置?

2023-07-21 06:00:15

由於一些歷史原因,重灌系統成為Windows使用者解決疑難雜症的祖傳手藝。受此影響,給硬碟分割區幾乎成為了一種執念,少則C、D兩個盤,誇張一點的5~6個盤的也不是沒有。

PS:macOS和Linux一直都不鼓勵給磁碟分割區,雖然不禁止但也不提倡。隨著雲技術和寬頻的提升,越來越多的人更喜歡把自己認為比較重要的資料儲存在雲盤而不是本地磁碟,一是可以跨裝置存取,二來也不擔心突然有一天電腦損壞或者丟失。

前幾天正在寫程式碼的時候,突然收到一條IDE的提示,C槽空間不足!趕緊開啟檔案資源管理器看了一眼,喔嚯……C槽還剩足足1MB多的空間,沒藍屏算是給足我面子了。

接下來就是行雲流水般的三板斧:

  • 退出應用程式(實體記憶體不足的時候會劃出一部分磁碟空間作為虛擬記憶體,C槽根目錄下的pagefile.sys就是虛擬記憶體生成的檔案,我看了一下,20+GB,也不敢刪,只能眼睜睜看著它把磁碟空間蠶食掉)
  • 清理垃圾檔案
  • 重啟電腦

砍完之後,可用空間提升到了9GB。但是也不夠啊,鬼知道什麼時候又只剩1MB了?用TreeSize分析了一下C槽的使用情況,發現.nuget資料夾的大小超過了10GB,雖然我在專案裡面做了一些設定,把當前專案用到的nuget包都存放在專案目錄下,而不是預設的全域性資料夾目錄,但是依然有很多系統程式以及LinqPad安裝的包會快取到預設目錄。

Windows預設的nuget包快取路徑是C:\Users\使用者名稱.nuget\packages。
masOS是/Users/使用者賬號/.nuget/packages

清理歷史版本可以騰出一些空間,但是治標不治本,如果某個程式或專案依賴於清理掉的版本,則可能被重新恢復或者乾脆報錯無法使用。那能不能把預設目錄指定到其他盤呢?

肯定能!

方法一:修改全域性組態檔

NuGet會在C:\Users\使用者\AppData\Roaming\NuGet\生成一個NuGet.Config檔案,這是nuget的全域性組態檔,如果.net專案沒有單獨設定,則會使用全域性設定恢復、快取和讀取依賴包。

用文字編輯器開啟這個檔案,內容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
</configuration>

如果想新增其他包源,可以在packageSources裡面下增加相關節點:

<!--增加一個Nexus Repository服務作為nuget源-->
<add key="MyNuget" value="https://nexus.mydomainname.com/repository/nuget-hosted/index.json" />
<!--增加一個本地磁碟的資料夾作為nuget源-->
<add key="Test Source" value="D:\.nuget\packages" />

如果要修改全域性包目錄,需要在NuGet.config的config節點設定globalPackagesFolder(如果沒有config節點,需要手動新增一個),設定後的完整內容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <config>
	<add key="globalPackagesFolder" value="D:\.nuget\packages" />
  </config>
</configuration>

下面是config支援的設定項:

  • dependencyVersion(僅限於 packages.config):包安裝、還原和更新的預設 DependencyVersion 值(未直接指定 -DependencyVersion 開關時)。 NuGet 包管理器 UI 也使用此值。 值為 LowestHighestPatchHighestMinorHighest

  • globalPackagesFolder (僅使用 PackageReference 的專案):預設全域性包資料夾的位置。 預設值為 %userprofile%\.nuget\packages (Windows) 或 ~/.nuget/packages (Mac/Linux)。 相對路徑可在專案特定的 nuget.config 檔案中使用。 此設定由 NUGET_PACKAGES 環境變數替代,該變數優先。

  • repositoryPath(僅限於 packages.config):安裝 NuGet 包的位置,而非預設的 $(Solutiondir)/packages 資料夾。 相對路徑可在專案特定的 nuget.config 檔案中使用。

  • defaultPushSource:如果操作未找到任何其他包源,則會標識應用作預設值的包源 URL 或路徑。

  • http_proxy http_proxy.user http_proxy.password no_proxy:連線到包源時要使用的代理設定;http_proxy 應為 http://<username>:<password>@<domain> 格式。 密碼已加密,且不能手動新增。 對於 no_proxy,該值是繞過代理伺服器的域的列表(以逗號分隔)。 可將 http_proxy 和 no_proxy 環境變數交替用於這些值。

  • maxHttpRequestsPerSource:控制從 NuGet 傳送到每個包源的並行請求的最大數量,以便進行包依賴項解析和下載。 上的 dotnet.exe 預設值是從 Int32.MaxValue 屬性派生的 HttpClientHandler.MaxConnectionsPerServer 。 此設定對 沒有影響dotnet.exe``Mac OS,因為限制設定為 16 以避免開啟檔案過多錯誤。 在 (如 )Visual Studio上執行的 的NuGet client tools預設值在 和 1MonoWindows 64.NET Framework nuget.exe 樣式專案的 Packages.config 預設值設定為 Environment.ProcessorCount。 將屬性設定為 maxHttpRequestsPerSource 小於預設值的值可能會影響 NuGet 效能。

  • signatureValidationMode:指定用於驗證包安裝和還原的包簽名的驗證模式。 accept值為 、require。 預設為 accept

<config>
    <add key="dependencyVersion" value="Highest" />
    <add key="globalPackagesFolder" value="c:\packages" />
    <add key="repositoryPath" value="c:\installed_packages" />
    <add key="http_proxy" value="http://company-squid:[email protected]" />
    <add key="signatureValidationMode" value="require" />
    <add key="maxHttpRequestsPerSource" value="16" />
</config>

方法二:設定環境變數

如果方法一不行,那就需要通過設定環境變數來指定全域性包位置。

  1. 依次開啟開始選單--設定--系統--系統資訊--高階系統設定,然後切換到「高階」索引標籤,點選「環境變數」按鈕開啟環境變數設定視窗。

  1. 環境變數設定視窗分為使用者環境變數和系統環境變數,我的目的是為了騰磁碟空間的,所以這裡選擇設定到系統級別的環境變數(其實都差不多)。

  1. 點選系統變數下方的新建按鈕,在彈出對話方塊中填寫變數名(NUGET_PACKAGES),通過瀏覽目錄選擇或直接在變數值輸入框內輸入新的全域性包目錄。然後點選確定按鈕。

  1. 確認新建成功後,在環境變數視窗點選確定儲存設定。
  2. 完成以上設定之後,新的設定會馬上生效(如果不放心可以重啟一下電腦),接下來可以把原先目錄裡面的包全部剪下到新目錄裡面。

點關注,不迷路。

如果您喜歡這篇文章,請不要忘記點贊、關注、轉發,謝謝!如果您有任何高見,歡迎在評論區留言討論……