从 VS Code 源码构建自己的 Windows 发行版:Damao Code
本文记录如何基于 VS Code OSS 源码,构建一个可与官方 VS Code、Code OSS 并存的 Windows x64 用户安装版。最终产物命名为 Damao Code,使用默认图标、Open VSX 扩展市场,并关闭遥测。
一、目标与环境
目标配置:
- 产品名称:
Damao Code - 内部名称和命令:
damao-code - 平台:Windows x64
- 安装方式:当前用户安装,无需管理员权限
- 扩展市场:Open VSX
- 遥测:关闭
- 自动更新:不配置
- 图标:保留 VS Code OSS 默认图标
- 并存能力:使用独立数据目录、协议、注册表项和 App ID
本次使用的主要环境:
- Node.js:
24.18.0,与仓库.nvmrc一致 - npm:
11.16.0 - Visual Studio:2026 Community
- Windows SDK:已安装 SignTool
- Inno Setup:由仓库 npm 依赖提供
构建前应先确认 Node.js 版本:
node --version
cat .nvmrc
VS Code 仓库对 Node.js 版本比较敏感,建议严格使用 .nvmrc 指定的版本。
二、定制产品信息
VS Code 的主要品牌配置位于根目录的 product.json。核心修改如下:
{
"nameShort": "Damao Code",
"nameLong": "Damao Code",
"applicationName": "damao-code",
"dataFolderName": ".damao-code",
"sharedDataFolderName": ".damao-code-shared",
"serverApplicationName": "damao-code-server",
"serverDataFolderName": ".damao-code-server",
"tunnelApplicationName": "damao-code-tunnel",
"win32DirName": "Damao Code",
"win32NameVersion": "Damao Code",
"win32RegValueName": "DamaoCode",
"win32AppUserModelId": "Damao.Code",
"win32MutexName": "damaocode",
"urlProtocol": "damao-code",
"enableTelemetry": false
}
还需要为以下字段生成自己的 GUID,不能继续使用 Code OSS 的默认值:
{
"win32x64AppId": "{{YOUR-SYSTEM-X64-GUID}",
"win32arm64AppId": "{{YOUR-SYSTEM-ARM64-GUID}",
"win32x64UserAppId": "{{YOUR-USER-X64-GUID}",
"win32arm64UserAppId": "{{YOUR-USER-ARM64-GUID}"
}
可以在 PowerShell 中生成 GUID:
[guid]::NewGuid().ToString().ToUpper()
独立的 App ID、数据目录、URL 协议、互斥锁和注册表名称,是自定义发行版与官方 VS Code 并存的关键。
配置 Open VSX
Code OSS 发行版不应直接使用微软官方 Visual Studio Marketplace。这里改用 Open VSX:
{
"extensionsGallery": {
"serviceUrl": "https://open-vsx.org/vscode/gallery",
"itemUrl": "https://open-vsx.org/vscode/item",
"publisherUrl": "https://open-vsx.org/vscode/publisher",
"resourceUrlTemplate": "https://open-vsx.org/vscode/asset/{publisher}/{name}/{version}/Microsoft.VisualStudio.Code.WebResources/{path}",
"extensionUrlTemplate": "https://open-vsx.org/vscode/unpkg/{publisher}/{name}/{version}/{path}",
"controlUrl": "",
"nlsBaseUrl": ""
}
}
如果当前网络不能访问 open-vsx.org,不影响程序本身构建,但运行后的扩展搜索和安装会受到影响。
修改后先检查 JSON 和差异格式:
node -e "JSON.parse(require('fs').readFileSync('product.json', 'utf8')); console.log('OK')"
git diff --check
三、安装依赖
正常情况下执行:
npm install
本机安装的是 Visual Studio 2026,而仓库工具链只识别 VS 2019/2022。可以将 VS 2026 的安装目录通过兼容变量显式传入:
export vs2022_install='C:\Program Files\Microsoft Visual Studio\18\Community'
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
npm install
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 只跳过测试用 Chromium 下载,不影响 VS Code 产品运行。
依赖目录不完整的问题
本次已有 node_modules 中存在多个不完整 npm 包,典型表现包括:
shiki/dist/langs.mjs缺失mermaid/dist/mermaid.d.ts缺失- MSAL 的
.d.ts文件在中间被截断 - 原生模块的
.node文件没有生成
遇到这种情况,不要通过修改源码或补 any 绕过错误,应根据对应扩展的锁文件干净恢复依赖:
npm --prefix extensions/copilot ci
npm --prefix extensions/markdown-language-features ci
npm --prefix extensions/mermaid-markdown-features ci
npm --prefix extensions/microsoft-authentication ci
Copilot 依赖安装时同样可以跳过 Playwright 浏览器:
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
npm --prefix extensions/copilot install
根目录原生模块缺失时,统一重建比逐个修复更可靠:
export vs2022_install='C:\Program Files\Microsoft Visual Studio\18\Community'
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
npm rebuild
应重点确认这些 Windows 原生绑定存在:
node_modules/@vscode/policy-watcher/build/Release/vscode-policy-watcher.node
node_modules/@vscode/spdlog/build/Release/spdlog.node
node_modules/@vscode/deviceid/build/Release/windows.node
node_modules/@vscode/windows-registry/build/Release/winregistry.node
四、构建 Windows x64 产品
下载并校验内置扩展后,执行完整构建:
npm run download-builtin-extensions
npm run gulp -- vscode-win32-x64
成功后,产品目录通常位于仓库同级目录:
../VSCode-win32-x64/
主程序为:
../VSCode-win32-x64/Damao Code.exe
SignTool 不在 PATH
Windows 收尾任务会调用 signtool.exe。如果出现:
Error: spawn signtool.exe ENOENT
先定位 Windows SDK 中的 SignTool,再临时加入 PATH:
export PATH="/c/Program Files (x86)/Windows Kits/10/bin/10.0.28000.0/x64:$PATH"
npm run gulp -- vscode-win32-x64-ci
SDK 版本目录应以本机实际安装版本为准。
rcedit 错误处理其他平台二进制
本次收尾阶段还遇到 rcedit 尝试修改 Linux/macOS 的 .node 文件:
Unable to load file: ...node-pty/prebuilds/linux-x64/pty.node
原因是产品依赖同时包含多平台预构建文件,而 Windows 资源修补任务扫描了全部 .node 文件。处理方式是在组装 Windows 产品时临时移出 prebuilds/darwin-* 和 prebuilds/linux-* 下的二进制,任务结束后立即恢复。
不要永久删除这些文件,否则会污染后续其他平台构建。可以使用带 trap 的脚本确保即使命令失败也会恢复文件。
五、生成用户安装包
安装器需要 tools/inno_updater.exe,先运行专用任务:
npm run gulp -- vscode-win32-x64-inno-updater
然后生成 Windows x64 用户安装版:
npm run gulp -- vscode-win32-x64-user-setup
安装包输出位置:
.build/win32-x64/user-setup/VSCodeSetup.exe
Inno Setup 可能输出语言文件或架构标识相关警告。只要最后显示 Successful compile,安装包就已经成功生成。
六、验证产物
验证版本和架构
使用产品自带 CLI:
& '..\VSCode-win32-x64\bin\damao-code.cmd' --version
本次输出:
1.139.0
6182a6ebe7cfcf1ce05126fcd475f66a5650cebc
x64
验证产品配置
检查打包后的配置:
node -e "const p=require('../VSCode-win32-x64/resources/app/product.json'); console.log({name:p.nameLong, app:p.applicationName, telemetry:p.enableTelemetry, gallery:p.extensionsGallery?.serviceUrl})"
确认以下信息:
- 名称为
Damao Code - 内部名称为
damao-code - 遥测为
false - 扩展市场指向 Open VSX
- 安装器中的
product.json包含"target": "user"
验证默认图标未变化
sha256sum resources/win32/code.ico
sha256sum ../VSCode-win32-x64/resources/app/resources/win32/code.ico
两个哈希应完全一致。
验证安装包完整性
sha256sum .build/win32-x64/user-setup/VSCodeSetup.exe
本次最终安装包:
文件:.build/win32-x64/user-setup/VSCodeSetup.exe
大小:约 266 MB
SHA-256:a18fd73307453128fdb4cf414817af0d710b8468fcaa97927fbb74fd287780f3
最后实际启动便携版,检查主窗口、扩展宿主、终端、内置调试器和 Copilot 是否能够正常加载。
七、代码签名说明
本地构建的安装包默认没有 Authenticode 签名,因此 Windows SmartScreen 可能提示“未知发布者”。这不影响程序运行,但正式分发时建议购买代码签名证书,并对主程序和安装器进行签名。
可以使用 SignTool 检查:
signtool verify /pa VSCodeSetup.exe
出现 No signature found 表示文件未签名,不代表安装包损坏。
八、最终结果
最终得到一个能够独立安装和运行的 Windows x64 发行版:
- 使用
Damao Code品牌 - 可与官方 VS Code、Code OSS 并存
- 使用独立用户数据、共享数据、协议和注册表标识
- 使用 Open VSX 扩展市场
- 默认关闭遥测和自动更新
- 保留默认图标和内置 Copilot
- 提供无需管理员权限的用户安装包
整个过程中最容易被忽略的不是品牌字段,而是构建环境与原生依赖完整性。遇到类型声明、资源文件或 .node 绑定缺失时,应优先修复依赖安装和原生编译环境,再继续打包。这样得到的产物才能通过实际启动验证,而不只是“安装器成功生成”。