120G固态C盘爆红!NuGet缓存清理+迁移路径

前言

我的日常开发机配置为 120G SSD 系统C盘 + 1T HDD 机械D盘,也是很多开发者的经典老旧机型搭配。120G固态硬盘容量本就十分有限,在安装Windows系统、Visual Studio及各类开发工具后,剩余空间寥寥无几。

长期使用下来,系统C盘频繁爆红、磁盘空间持续告警。使用Windows自带磁盘清理、各类第三方C盘瘦身工具全盘扫描后,仅能释放数百MB垃圾文件,无法从根源解决空间不足问题。

经过排查定位到核心元凶:C盘默认生成的 .nuget 缓存目录,仅全局NuGet包缓存就占用6G+空间,叠加HTTP缓存、临时运行缓存、插件缓存后,持续蚕食宝贵的固态存储空间。

单纯手动删除缓存仅能临时释放空间,后续打开、还原.NET项目时,NuGet会自动重新下载缓存文件,C盘很快会再次爆满。

本文分享一套完整根治方案:一键清理冗余NuGet缓存快速救急,通过环境变量全局迁移全部NuGet缓存到机械硬盘。同时纠正全网多数教程的错误误区:修改NuGet环境变量无需重启电脑

一、认识NuGet四大缓存目录(C盘空间占用核心)

NuGet不会将依赖包局限在项目目录中,为了提升还原、安装效率,会在系统目录自动维护四类缓存文件,长期累积各版本依赖包,是.NET开发者C盘膨胀的主要原因。四类缓存默认全部存储在C盘,具体信息如下:

缓存类型 Windows 默认C盘路径 核心作用
global-packages 全局包 %userprofile%\.nuget\packages 存储解压完成的完整NuGet依赖包,体积最大、占用空间最多,项目运行、还原均优先读取此目录
http-cache 网络缓存 %localappdata%\NuGet\v3-cache 缓存NuGet压缩包源文件,默认30分钟自动过期,用于加速重复下载、版本检索
temp 临时目录 %temp%\NuGetScratch 存放包安装、还原过程中的临时文件,同时承担进程文件锁功能,协调多NuGet进程运行
plugins-cache 插件缓存 %localappdata%\NuGet\plugins-cache 适用于NuGet4.8及以上版本,存储插件运行请求结果缓存,提升工具运行效率

可通过以下命令快速查看本机所有NuGet缓存的真实存储路径:

dotnet nuget locals all --list

二、一键清理C盘NuGet冗余缓存(紧急救急)

1. 前置必备操作

清理前必须关闭所有 Visual Studio、Rider、终端窗口及.NET相关后台进程,否则缓存文件被进程占用,会触发「文件正在使用、删除失败」的报错。

2. 命令行清理(推荐)

打开全新PowerShell或CMD窗口,执行以下命令,可按需全局清理或针对性清理指定缓存:

# 一键清理全部NuGet本地缓存(最常用)
dotnet nuget locals all --clear

# 单独清理体积最大的全局依赖包缓存
dotnet nuget locals global-packages --clear

# 单独清理HTTP网络缓存
dotnet nuget locals http-cache --clear

3. VS可视化清理方式

无需输入命令,可直接通过Visual Studio自带功能清理:工具 → NuGet包管理器 → 包管理器设置 → 常规 → 点击「清除NuGet本地资源」,效果等同于全局清理命令。

安全说明:清理本地NuGet缓存不会损坏任何项目源代码,仅删除本地冗余缓存文件。清理后首次还原项目时,会自动从官方NuGet源重新下载对应依赖包,完全安全无害。

本次实操中,清理完成后直接释放 6G+ C盘空间,彻底解除系统盘红色告警。但该方式仅为临时解决方案,未修改缓存路径的情况下,后续开发依旧会向C盘写入缓存,空间会再次被占满。

三、环境变量迁移缓存到机械D盘(根治方案)

根据微软官方文档明确说明:NuGet环境变量优先级最高,优先级高于 nuget.config 配置文件、MSBuild属性,配置后全局生效,完美适配VS、dotnet CLI所有开发场景,是最稳定的迁移方案。

1. 新建机械盘缓存目录

在大容量机械硬盘中新建根目录,示例路径:D:\NuGetCache。无需手动创建子文件夹,NuGet运行过程中会自动生成对应分类目录。

2. 环境变量选择:用户变量 VS 系统变量

很多开发者纠结变量添加位置,这里精准区分适用场景,按需配置即可:

✅ 99%个人开发者:添加【用户变量】

仅对当前Windows登录账号生效,无需管理员权限,配置简单、完全满足日常开发需求,本文默认推荐此配置。

✅ 特殊场景:添加【系统变量】

满足以下任意情况,需将4条NuGet变量添加至系统变量(整机全局生效):

  • 电脑存在多个Windows登录账号,所有账号均需进行.NET开发,需统一缓存路径

  • 本地运行系统级服务、CI自动编译、后台自动化构建任务(系统进程仅读取系统变量)

  • VS、dotnet以管理员身份运行,出现用户变量不生效的问题

核心区别:用户变量 = 单账号自用;系统变量 = 整机所有账号、系统服务全局生效。

3. 配置四条核心环境变量

此电脑 → 右键属性 → 高级系统设置 → 环境变量,根据自身场景新建对应变量,参数如下:

环境变量名 对应D盘缓存路径
NUGET_PACKAGES D:\NuGetCache\packages
NUGET_HTTP_CACHE_PATH D:\NuGetCache\v3-cache
NUGET_SCRATCH D:\NuGetCache\NuGetScratch
NUGET_PLUGINS_CACHE_PATH D:\NuGetCache\plugins-cache

4. 重点答疑:无需重启电脑!新终端直接生效

网上绝大多数教程要求「修改环境变量后重启电脑」,这是典型误区,本次实操结合Windows机制给大家讲透原理:

生效核心原理

Windows环境变量采用进程启动快照机制

  • 环境变量修改保存后,会即时写入系统注册表,永久生效;

  • 修改前已打开的VS、终端、后台进程:启动时已加载旧环境变量至内存,不会自动刷新注册表新配置,依旧读取C盘旧缓存路径;

  • 全新打开的终端/PowerShell:启动瞬间自动读取最新注册表配置,无需重启电脑,直接生效。

正确生效操作(替代重启整机)

仅需 彻底关闭所有Visual Studio并重新打开 即可。VS为常驻进程,不重启IDE会出现「命令行显示D盘路径、VS还原依旧写入C盘」的诡异问题。

5. 校验迁移是否成功

打开全新终端,执行校验命令:

dotnet nuget locals all --list

输出路径全部指向 D:\NuGetCache 下属目录,即代表缓存迁移配置完全成功。

四、最终效果验证

  1. 重启Visual Studio,打开任意.NET项目解决方案;

  2. 手动执行NuGet包还原操作;

  3. 查看D盘 D:\NuGetCache 目录,自动生成对应缓存文件;

  4. C盘 .nuget 目录不再新增任何缓存数据,迁移彻底生效。

小提示:机械硬盘读写速度略低于固态硬盘,首次包还原速度会有轻微下降,但完全不影响日常开发,可一劳永逸解决小容量固态C盘爆满问题,性价比极高。

五、踩坑总结 & 关键注意事项

  • 清理文件占用报错:未关闭VS、终端等开发工具直接清理,会提示文件被占用,关闭所有.NET相关进程后重试即可;

  • 环境变量生效误区:新终端即时生效,无需重启电脑,仅需重启VS保证IDE加载最新配置;

  • 首次还原变慢:全局缓存清空后,首次项目还原需要重新下载所有依赖包,属于正常现象,后续还原会复用本地缓存,速度恢复正常;

  • 配置优先级规则:NuGet环境变量优先级最高,会覆盖项目内 nuget.config 配置,实现全局路径统一;

  • 无官方自动清理工具:NuGet官方未提供自动清理无用旧版本包的命令,日常可定期执行 dotnet nuget locals all --clear 手动瘦身,或使用社区开源清理工具。

总结

对于使用小容量固态做系统盘的.NET开发者,C盘爆红切勿依赖系统简易清理工具,精准定位开发工具缓存才是核心解决方案:

  1. 优先排查 .nuget、npm 等开发专属缓存,这类文件是C盘空间占用的重灾区;

  2. 通过 dotnet nuget locals all --clear 命令可一键释放GB级冗余空间,快速救急;

  3. 配置四条NuGet专属环境变量,可彻底将缓存迁移至机械硬盘,永久解决C盘膨胀问题;

  4. 掌握环境变量生效机制:新终端即时生效,仅需重启IDE,无需整机重启,规避全网通用误区。

posted @ 2026-08-18 10:59  我的名字长沙雕跟着念  阅读(2)  评论(0)    收藏  举报