从VSCode源码构建专属发行版


从 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 绑定缺失时,应优先修复依赖安装和原生编译环境,再继续打包。这样得到的产物才能通过实际启动验证,而不只是“安装器成功生成”。


  目录