vsce package只打包dependencies中声明的包,未显式写入则运行时报错;extensionDependencies仅提示不自动安装;离线场景须锁定精确版本并完整拷贝含二进制的扩展目录。

vsce package 会漏掉没写进 dependencies 的包
打包时只包含 package.json 中 dependencies 字段声明的模块,哪怕代码里 require('lodash') 了,只要没显式写进 dependencies,vsce package 就不会把它打进 .vsix。运行时直接报 Error: Cannot find module 'lodash'。
- 必须执行
npm install lodash --save(不是--save-dev),确保它出现在dependencies里 -
devDependencies里的包(如typescript、vscode-test)不会被打包,也不该被运行时引用 - 用
npm ls lodash验证是否已安装且版本可解析,避免因 peer 依赖未满足导致树断裂
extensionDependencies 声明后 VSCode 不自动安装
extensionDependencies 字段只起“提示”作用,VSCode 不会像 npm install 那样帮你拉取并启用依赖插件。用户看到“已安装”,但功能缺失——比如装了 ms-python.python 却没装 ms-toolsai.jupyter,Jupyter Notebook 支持就完全不可用。
- 必须把依赖插件也列进你的离线清单:
ms-python.python@2024.6.0和ms-toolsai.jupyter@2024.5.1 - 批量安装时,顺序无关紧要,但所有
.vsix文件必须提前下载到位 - 如果目标环境禁用了自动更新或策略限制,
extensionDependencies更是形同虚设,得靠人工核对
^ 和 ~ 版本号在离线场景下等于埋雷
本地开发时 "lodash": "^4.17.21" 看似省事,但打包后实际打进 .vsix 的是当时 node_modules 里的版本。离线复现时若用不同机器重装,可能拉到 4.18.0 —— 而这个版本恰好改了某个 API,插件就崩了。
- 发布前一律改用精确版本:
"lodash": "4.17.21" - 用
npm install lodash@4.17.21 --save锁定,再检查package-lock.json是否固定了完整路径和 integrity 值 - CI 流程中加一步
npm ls lodash --depth=0,确认解析出的版本与package.json完全一致
language server 类插件不能只拷 .vsix
像 ms-python.python 或 rust-lang.rust-analyzer 这类插件,.vsix 只是“启动器”。首次激活时才会去下载 pyright-server 或 rust-analyzer 的 native 二进制,离线环境下这步必然卡死或报 spawn ENOENT。
- 必须在有网机器上完整触发一次:打开对应文件 → 等状态栏变绿 → 查看 Output 面板确认无报错
- 然后完整拷贝整个扩展目录(含
out/、dist/和隐藏的.server/或bin/子目录) - 路径不能错:
~/.vscode/extensions/ms-python.python-2024.6.0/(Linux/macOS)或%USERPROFILE%\AppData\Roaming\Code\Extensions\ms-python.python-2024.6.0\(Windows)
真正麻烦的从来不是怎么装,而是哪些东西“看起来装上了,其实根本没跑起来”——尤其是那些依赖外部进程、动态下载、或靠全局状态协同的插件。


















