
C盘又红了。这恐怕是每个开发者都绕不开的噩梦。我最早遇到的时候还没当回事直到某次在某台主力机上编译一个Demo项目项目跑到一半直接提示磁盘空间不足我才火急火燎地打开资源管理器挨个目录排查。一看用户目录下的.vscode文件夹好家伙十几G就这么没了再往里看extensions子目录独占了大头光是几个语言服务和辅助扩展就吃掉了大半个系统盘。这个现象在 Visual Studio Code下面统一简称 VS Code用户里太普遍了。插件装得越多扩展目录就越膨胀偏偏系统盘往往又是整台机器里最小的分区。更麻烦的是公司下发的主机、云桌面、临时分配的虚拟机系统盘可能只有120G甚至更少想换大硬盘还不是自己能决定的事。于是怎么把扩展目录挪走就成了一个非常刚需的问题。这篇文章就是把这件事讲透。我会从 VS Code 默认把插件放在哪里、为什么那么占空间说起再到改扩展目录的几种主流做法各自的适用场景和操作细节最后是我实测下来踩过的几个坑和排查思路。不管你是刚入门的开发新手还是已经写了一年代码想整理环境的熟手看完基本就能照着操作。1. 先搞清楚插件默认放在哪、为什么占这么多空间1.1 默认扩展目录在不同系统上的位置VS Code 的扩展目录默认都在用户主目录下面Windows、macOS、Linux 基本都是同一个规律只是路径形式略有区别Windows:C:\Users\你的用户名\.vscode\extensionsmacOS:~/.vscode/extensionsLinux:~/.vscode/extensions为什么放着安装目录不用偏要往用户目录塞因为 VS Code 的安装目录通常是只读的写进去容易出权限问题扩展装到用户级目录单机多用户时每个人有自己的一套扩展升级 VS Code 也不会丢东西备份起来也方便。这个设计对大多数场景是友好的唯一的坏处就是它默认跟着系统盘走。1.2 扩展体积膨胀的三个来源以前的扩展大多是一堆 JavaScript 代码几百 KB 就搞定了但现在完全不是一回事。扩展体积变大主要是三个原因语言服务器Language Server太大。Python、Java、C 这类扩展会启动一个独立的后台进程负责语法分析、智能补全、索引构建这些组件下载下来动辄几百 MB装完再解压体积轻松破 GB。AI 辅助类扩展带本地依赖。不少代码生成、补全工具为了低延迟会在本地放模型缓存或推理组件安装时拉取的东西非常多。基础组件重复下载。很多扩展共享同一批底层依赖比如 TS 语言服务协议实现、调试适配器装了相关插件就会各下载一份几十个扩展加在一起体积非常可观。我记得给 A 同学排查过一次他扩展面板里一共才 40 来个扩展光清理语言服务器历史版本之前扩展目录就已经占了 8.6G。真要找罪魁祸首可以用文件管理器打开扩展目录按大小排序基本一眼就能看出到底是谁在吃空间。1.3 除了占空间还拖慢启动速度扩展目录放在系统盘还有一个隐蔽问题这里全是海量小文件JS 编译产物、source map、node_modules 一层套一层。VS Code 启动时要扫描这个目录、加载扩展如果系统盘是普通机械盘或性能一般的固态启动明显会被拖慢。表现出来就是窗口秒开但扩展后台加载半分钟。另外提醒一点.vscode目录里不只有扩展。globalStorage、workspaceStorage、logs这些全局缓存、工作区数据、崩溃日志也全在主目录下。哪怕你只改扩展路径这些零碎文件依然会继续占系统盘。明白这一点后面再看各种改路径的方案你就会知道为什么有些做法考虑得更周全。2. 修改插件路径的几条路线与选型思路2.1 方案速览表方案操作方式生效范围适合谁--extensions-dir启动参数在桌面快捷方式或命令行里加参数只对按这种方式启动的进程生效固定用某个快捷方式启动的人VSCODE_EXTENSIONS环境变量修改系统/用户环境变量所有启动方式都生效想一劳永逸解决的人便携模式 data 目录在 VS Code 安装目录旁建data/extensions从该安装目录启动即生效想把整个环境随身带的人符号链接/目录联接把旧扩展目录重定向到别的盘全部启动方式生效VS Code 无感知不想动任何 VS Code 配置的熟手settings.json 扩展位置设置写extensions.defaultLocation视版本而定表现不稳定想用 GUI 解决的人第一条、第三条和第四条是我验证最多、稳定性最好的。第二条也靠谱但用户变量藏在系统设置里出了问题不太好排查。第五条写在这里主要为了提醒大家网上不少资料会说在 settings.json 里设置扩展目录就行了可我在多个版本上实测下来这个设置的表现时灵时不灵一旦不生效回退路径还特别绕。所以对新入门的读者我不建议把它当首选方案。2.2 为什么首选命令参数在所有方案里--extensions-dir是最透明的。VS Code 启动时读到这个参数就直接把它当成扩展目录的根不写注册表、不动配置文件生效不生效一眼就能看出来。临时调试的时候甚至可以对某一次启动单独指定一个特殊目录。它也很符合 VS Code 本身的设计哲学这个工具本质上是一个命令行工具加一层 GUI很多行为都能通过 CLI 参数控制。真正动手之前建议先跑一次验证code --extensions-dir D:\Tools\VSCodeExtensions --list-extensions如果 D 盘那个目录是空的命令不会报错只是列出一个空列表。看到空列表基本就说明参数已经被接受了。这个参数的局限是它只影响当前启动的 VS Code 进程。桌面快捷方式改了参数但从开始菜单或code命令启动的另一套 VS Code走的还是原来的路径。所以想长期生效要么把不同入口统一一下要么用环境变量方案这个后面会细说。2.3 符号链接方案的原理视角符号链接的思路和命令参数完全不一样。它不告诉 VS Code你的扩展目录在别处而是让 VS Code 以为扩展还在原来的位置实际是操作系统在中间做了一个映射。VS Code 去往C:\Users\...\\.vscode\extensions里写东西系统把这些写入全部转发到 D 盘的实际目录。这也是为什么符号链接能做到所有启动方式都生效。不管从哪个入口启动VS Code 永远访问同一个路径自然也永远命中同一个映射。代价是创建链接需要管理员权限或者特定工具换了机器、盘符一变链接就失效需要重建。3. 最通用的一招给启动命令加 --extensions-dir3.1 先迁移旧扩展再切换目录动手改参数之前先想清楚一个问题新扩展目录是空的还是要把旧扩展搬过去。如果新目录是空的操作最简单但副作用是第一次启动时 VS Code 会发现自己没有任何扩展接着在右下角提示扩展缺失开始重新下载。之前装了七八十个扩展这个重装过程会相当漫长而且某些扩展的版本和原来的还不完全一样。更好的做法是先复制、后切换先新建一个目标目录比如D:\Tools\VSCodeExtensions。把旧扩展目录完整复制过去。Windows 上用robocopy最稳robocopy C:\Users\用户名\.vscode\extensions D:\Tools\VSCodeExtensions /E /COPYALLmacOS/Linux 用cp -acp -a ~/.vscode/extensions /data/vscode-extensions复制完成后再给启动命令加--extensions-dir指向新目录。确认新目录里的扩展都能正常加载日常用的扩展状态正常然后回头把旧目录改名或删除避免两边并存造成混乱。为什么推荐robocopy而不是普通复制粘贴因为/E能复制完整目录树和空目录/COPYALL会保留文件权限信息。扩展目录里有些可执行文件在后续更新时需要校验权限丢了这部分个别扩展就会报无法写入的错误。3.2 修改桌面快捷方式的具体步骤如果你习惯从桌面快捷方式启动 VS Code改这一个入口就够了。完整操作如下在桌面上找到 VS Code 的快捷方式右键选择属性。切到快捷方式选项卡在目标栏里会看到类似这样的内容C:\Program Files\Microsoft VS Code\Code.exe在末尾追加参数整体变成C:\Program Files\Microsoft VS Code\Code.exe --extensions-dir D:\Tools\VSCodeExtensions点应用再点确定。这个步骤最容易翻车的地方是参数外面忘了加引号。如果目录路径里包含空格比如D:\My Extensions不加引号 Windows 会把它拆成两个参数传进去最后 VS Code 以为扩展目录是D:\My一个不存在的路径。参数值和路径值都要用英文双引号包住这条规则宁可多遵守也别偷懒。改完后用这个快捷方式启动一次 VS Code。打开命令面板CtrlShiftP输入 Preferences: Open Settings (JSON)看一眼配置没有被改动就说明没问题。然后打开扩展视图随便点一个已安装的扩展在详情页面的底部信息里能看到扩展的安装位置确认它指向了新目录。3.3 命令行启动时也要记得带参数如果你习惯敲code命令直接打开项目那命令行里也要带code --extensions-dir D:\Tools\VSCodeExtensions .但这有个很现实的问题你不可能每次都记得带。所以如果你的使用场景主要分布在命令行我更建议直接使用环境变量方案。这个命令参数方案最理想的用户画像是每天固定从某个快捷方式进 VS Code的人。顺带一提命令行参数和环境变量同时存在时实际以参数为准。我不建议同时维护两个入口改多了反而乱排查问题会绕一大圈。4. 环境变量与便携模式一劳永逸的两种玩法4.1 设置 VSCODE_EXTENSIONS 环境变量--extensions-dir的参数虽然好用生效范围太窄是个硬伤。我之前只改了桌面快捷方式结果第二天通过远程会话打开窗口时扩展还是按旧路径加载。排查下来才发现因为 Remote 连接拉起 VS Code 窗口时走的并不是那个改过参数的快捷方式参数压根没传进去。这种启动方式不统一的问题最适合用环境变量解决。VS Code 会识别一个名为VSCODE_EXTENSIONS的环境变量只要它存在就会把它当扩展目录来用。Windows 设置步骤打开系统属性 → 高级 → 环境变量。在用户变量区域点新建变量名填VSCODE_EXTENSIONS变量值填目标目录比如D:\Tools\VSCodeExtensions。确定保存后重新启动 VS Code。环境变量改动需要新进程才能读到。macOS/Linux 在 shell 配置里加一行export VSCODE_EXTENSIONS/data/vscode-extensions然后source一下或重开终端。环境变量的好处是彻底。无论是点桌面图标、从 Shell 里敲code还是某个远程会话间接拉起 VS Code读到的都是同一个扩展目录。我实测下来连通过任务计划自动启动的 VS Code 也会遵守这个变量。坑也很明显环境变量一旦设了就全局生效。如果哪天你想临时用回默认扩展目录不能像命令参数那样随手去掉得改掉环境变量再重启所有 VS Code 进程。所以这个方案适合确定要长期把扩展搬走的人。4.2 官方便携模式把 VS Code 变成一个绿色工具箱比环境变量更低调的是 VS Code 官方支持的便携模式Portable Mode。规则很简单在 VS Code 安装目录旁边新建一个data文件夹在data里再建extensions子目录从那个安装目录启动 VS Code 时它会自动进入便携模式扩展目录被放到data\extensions下。这招对付系统盘空间紧张非常好用因为它是把扩展目录、用户数据、缓存一股脑全从用户主目录挪走放进一个你完全控制的目录。别人给你一台临时主机你甚至可以整个拷到 U 盘上插到哪台机器都是你熟悉的那套环境。操作步骤在 VS Code 安装目录下新建文件夹data。在data里面新建extensions文件夹可以空着也可以把旧扩展复制进去。从该目录启动Code.exe检查扩展目录是否生效。要注意的一点便携模式要求安装目录和data在同一棵目录树下。如果你把 data 放 D 盘、VS Code 本体在 C 盘那就不算标准的便携模式。当然可以给 data 目录建符号链接变通一下但这已经属于更进阶的玩法了。4.3 为什么优先考虑源头而不是事后搬家环境变量和便携模式实际上执行的是同一个策略从源头上改变扩展的存放位置而不是等 VS Code 把东西装到 C 盘再搬走。后者的问题在于扩展的安装和更新逻辑并不知道目录被搬过可能在更新时尝试重新写回旧位置也可能因为旧目录里的锁定文件还在出现各种奇怪问题。我一直觉得扩展路径这种事最好的处理方式是让数据落在它该落的地方。VS Code 默认放用户目录是因为单机场景下最不犯错。当系统盘不够用时与其反复手动清理不如直接把扩展目录钉在数据盘。环境变量和便携模式都做到了这一点区别只是生效范围和便携程度的取舍。5. 符号链接方案详解让 VS Code 感知不到变化5.1 符号链接和普通快捷方式不是一回事很多人一听链接就觉得是快捷方式但其实两者完全不同。快捷方式是一个文件里面记录着目标路径应用程序必须主动去解读它才能跳转符号链接或目录联接则是操作系统层面直接做的转发VS Code 根本感知不到中间有映射。用个生活化的类比快捷方式像是门口贴了张纸条去隔壁找老张符号链接像是给自家门牌号挂了个转接器无论你写的收件人是谁邮递员都会自动转到隔壁。所以符号链接能做到对应用完全透明。5.2 Windows 下如何用 mklink 创建目录联接Windows 上创建目录链接有两种方式实际效果区别不小mklink /J创建的是目录联接Junction不需要管理员权限普通 CMD 窗口就能执行。mklink /D创建的是符号链接Symbolic Link通常需要管理员权限或者在系统设置里开启开发者模式。对我们改扩展目录这件事来说用/J就够了它已经能实现跨盘转发还不用额外开权限性价比最高。完整操作过程关闭所有 VS Code 窗口确保没有进程在读写扩展目录。把旧扩展目录C:\Users\用户名\.vscode\extensions重命名成extensions_bak或者直接移动到你准备存放的 D 盘目录里。在 CMD 窗口执行mklink /J C:\Users\用户名\.vscode\extensions D:\Tools\VSCodeExtensions检查链接是否生效在资源管理器里看C:\Users\用户名\.vscode\extensions如果它带一个快捷方式的图标并且能直接看到 D 盘里的文件内容说明链接成功了。PowerShell 里也有等价命令New-Item -ItemType Junction -Path C:\Users\用户名\.vscode\extensions -Target D:\Tools\VSCodeExtensions如果你刚开始迁移旧目录还没搬过去可以先把旧目录复制到 D 盘再删掉 C 盘原目录最后创建链接。这里最容易犯的错是顺序搞反如果原目录还存在mklink会报文件已存在所以原目录必须已经处理好。5.3 macOS/Linux 下的操作macOS 和 Linux 用ln -s创建符号链接一般不需要管理员权限mv ~/.vscode/extensions /data/vscode-extensions ln -s /data/vscode-extensions ~/.vscode/extensions然后通过ls -l ~/.vscode/extensions确认结果输出里会显示类似extensions - /data/vscode-extensions的内容说明链接已经建立。5.4 这个方案的边界与风险符号链接方案最大的优点是 VS Code 完全无感但风险也要提前知道盘符变动会让链接失效。Windows 的盘符不是永久的拔掉移动硬盘、换机器、重新挂载分区链接就断了。重装系统之后链接也全部需要重建。网络盘和共享目录不推荐。把扩展目录放在网络路径上Windows 可能会阻止加载来自不受信任位置的扩展表现为扩展全部不可用。防病毒软件可能把符号链接当作可疑对象扫描导致启动变慢甚至误删链接路径。这个方案比较适合两类人一是已经装了大量扩展、不想重新配置任何东西的人二是对命令行已经非常熟悉、链接失效自己能快速处理的人。如果你是新手我建议优先用前面的环境变量或便携模式别把弯路留给自己。6. 迁移完成之后的连带问题与排查思路6.1 扩展消失或提示重新安装改路径后最常见的现象就是扩展面板里少了一大片扩展或者 VS Code 右下角弹通知说某些扩展需要重新加载。原因往往是新目录里根本没有这些扩展——只改了参数没复制旧目录VS Code 找不到本地文件只能按未安装处理。解决思路分两步确认新目录里有没有内容。没有就先按 3.1 节的方式把旧目录迁过去。如果复制完之后仍然提示找不到检查目录权限。Windows 上把扩展目录放到非系统盘的根目录后某些目录的继承权限和原用户目录不一样VS Code 进程可能没有写权限。右键目录 → 属性 → 安全 → 把当前用户的完全控制权限加上问题就能解决。还有一个人容易忽略的假消失扩展列表里有一部分是内置扩展比如内置的 TypeScript 支持、Markdown 预览它们本来就不在extensions目录里。所以验证迁移是否成功要看第三方扩展别拿内置扩展数量来对比。6.2 Settings Sync 同步的是列表不是安装包很多人的认知是不管目录怎么改反正我开了设置同步扩展会自动装回来。这是个误区。设置同步同步的是扩展列表也就是扩展 ID 和版本范围并不是扩展安装包。新路径下第一次启动VS Code 会拿着这个列表去扩展市场重新下载。如果你的网络环境对扩展市场不太友好就会卡在下载、失败、部分扩展装不上这些环节。我的习惯是迁移前先把旧扩展目录整个复制过去而不是指望同步同步只当作跨机器保持列表一致的辅助手段。复制能保留历史版本和本地缓存对离线依赖比较多的扩展尤其有用。6.3 Remote 场景下要分清本地扩展和远端扩展如果你常用 Remote-SSH 或 WSL 做远程开发还有一个概念必须先分清扩展分本地扩展和远程扩展。远程打开一个项目VS Code 会自动在远端安装并运行相关扩展比如 Python 扩展在远端其实有自己的一套运行时。你改的是本地扩展目录它不会让远端扩展也搬到 D 盘远端扩展照样装在远程主机的用户目录下。这不是故障而是设计使然。但第一次碰到的人往往以为迁移失败白白排查半天。快速分辨方法很简单本地扩展状态会标注 LOCAL远程会话里的扩展会标注 SSH: 主机名 或 WSL: 发行版名。6.4 盘符变动与特殊目录的隐患扩展目录放在数据盘遇到盘符变动就麻烦。今天挂载的 D 盘明天可能变成 E 盘或者干脆不在了。VS Code 启动后按老路径去读扩展全部不可用。解决办法是尽量把扩展目录放在固定盘符的固定分区少放移动盘换机器后同步改环境变量或快捷方式参数。另一个我踩过的坑是把扩展目录放进网盘同步目录。网盘会不停同步、创建冲突副本、锁定文件扩展目录里恰恰全是同步盘最讨厌的小文件结果就是扩展更新失败、启动卡顿甚至时好时坏像幽灵扩展。如果你有网盘同步习惯务必把扩展目录加到同步排除列表里否则排查起来会非常让人头大。7. 不同场景怎么选以及一点个人体会7.1 常见场景对应的最优解读到这里方案都了解得差不多了我帮你把决策路径也捋出来公司主机是统一镜像桌面只有一个快捷方式是正门C 盘紧张选--extensions-dir改快捷方式目标即可影响范围最小。自己主力开发机长期需要扩展放数据盘选VSCODE_EXTENSIONS环境变量一劳永逸所有启动方式都生效。经常在不同机器上写代码想随身带环境选便携模式data 目录放在 U 盘或本地缓存目录下。已经按默认路径装了一堆扩展不想动任何配置和启动命令选符号链接或目录联接创建的时候用管理员权限或/J就行其他不用多操心。每个方案都有它的前提条件没有绝对的最优只有适合你当前环境和操作习惯的。7.2 顺手处理 .vscode 里的其他重目录无论选了哪种方案我还建议你顺便看一下.vscode目录里另外两个重量级文件夹globalStorage和workspaceStorage。这两块不是扩展但同样是小文件密集、读写频繁的类型。workspaceStorage是每个工作区一份数据项目开得多了体积也会涨得很快。如果动手能力够可以给.vscode整个目录做迁移先复制到数据盘再用环境变量或便携模式把用户数据统一指过去。这样系统盘上剩下的就只有 VS Code 本体了C 盘的压力一下子小一大截。最后说点自己的体会。改扩展路径这件事本质上是在处理软件默认行为和你的硬盘布局之间的冲突。工具的默认值都是为大多数普通用户设计的系统盘不够用不是工具的错但也别硬扛。我判断一个方案是不是真正解决问题标准很简单改完之后你自己不再需要额外记任何规则不需要每次启动都执行特殊操作。哪个方案能让你彻底忘掉这个问题的存在就用哪个。