code --install-extension 命令必须用绝对路径离线安装语言包,需配合 realpath/resolve-path 转换路径、校验 engines.vscode 版本兼容性、写入 "locale": "zh-hans" 到 settings.json,并注意策略禁用和架构匹配。

code --install-extension 命令必须用绝对路径
离线部署语言包(如 ms-ceintl.vscode-language-pack-zh-hans)时,code --install-extension 是唯一支持脚本化的标准入口。但它不接受相对路径或波浪号展开:~/Downloads/zh-hans.vsix 在 macOS/Linux 上会失败;C:\ext\zh-hans.vsix 在 Windows 上若含空格(如 C:\Program Files\vsix\)必须加双引号。
常见错误现象:命令执行后无提示、无报错、插件也不出现——大概率是路径解析失败。
- Linux/macOS:用
realpath转成绝对路径,例如code --install-extension "$(realpath zh-hans.vsix)" - Windows PowerShell:用
Resolve-Path,例如code --install-extension (Resolve-Path "zh-hans.vsix").Path - 脚本中避免硬编码路径,优先从环境变量读取,比如
EXT_DIR="${VSIX_DIR:-./vsix}"
语言包安装后不生效?检查 locale 设置和禁用策略
装完 ms-ceintl.vscode-language-pack-zh-hans 之类语言包,重启 VSCode 后界面仍是英文,不是安装失败,而是设置未触发或被覆盖。
关键点在于:locale 配置项必须显式写入 settings.json,且不能被策略锁死。
- 用户级配置路径:
%APPDATA%\Code\User\settings.json(Windows)、~/.config/Code/User/settings.json(Linux)、~/Library/Application Support/Code/User/settings.json(macOS) - 必须包含这一行:
"locale": "zh-hans"—— 注意值是语言 ID,不是插件 ID - 如果右下角状态栏显示
Extensions disabled by policy,说明组策略禁用了扩展,此时语言包即使装上也不会加载 - 某些企业镜像版 VSCode 会默认写死
"locale": "en",脚本部署后要 grep 替换掉
批量部署多个语言包时,注意依赖顺序和覆盖逻辑
VSCode 不允许同时启用多个语言包,后安装的会覆盖前一个的 locale 设置。但如果你脚本里依次执行:
code --install-extension zh-hans.vsix code --install-extension ja-jp.vsix
结果是日语生效、中文被顶掉——这不是 bug,是设计行为。
- 真正需要多语言切换的场景,应只装一个语言包,靠手动切换
locale设置实现 - 脚本部署建议用
--force参数确保覆盖旧包:code --install-extension zh-hans.vsix --force - 多个语言包可并存于
~/.vscode/extensions/目录,但只有settings.json中指定的那个才激活 - 若需预置多语言供用户自选,脚本只需安装全部 .vsix,并写入默认
locale,无需额外干预
离线脚本最易忽略的验证环节:package.json 引擎版本匹配
语言包也是扩展,同样受 engines.vscode 限制。比如你下载的 zh-hans-1.92.0.vsix,解压后看 extension/package.json:
"engines": { "vscode": "^1.92.0" }
而目标机器上 code --version 输出的是 1.91.3,安装就会静默失败(Windows 下甚至不报错)。
- 自动化脚本中必须加入校验步骤:用
unzip -p zh-hans.vsix extension/package.json | grep engines提取版本要求 - 提取本地 VSCode 主版本号:
code --version | head -n1 | cut -d. -f1,2 - 比较逻辑不能只看字符串相等,要支持语义化版本的 ^ 匹配(简单脚本可用
awk做主次版本比对) - ARM64 架构的 Mac 若装了 x64 构建的语言包,也会无声失效——
Help → About里括号内的架构标识必须一致











