本文首发同名微信公众号:前端徐徐

大家好,我是徐徐。今天我们聊聊 electron-builder 中 windows 是如何打包的。
前言
electron-builder 中 windows 的打包其实也是很复杂的,因为光是使用这个工具去打包就会遇到很多问题,更别说去探究里面的源码了解其原理了。但是之前已经写了 electron-builder 中 macOS 的源码和原理解读,然后为了彻底了解所有平台的打包逻辑,我又开始阅读 windows 的构建源码,这里跟大家分享一下我的一些理解。
涉及的核心源码路径
- winPackager.ts:Windows 平台打包的核心文件
- AppxTarget.ts:用于创建 AppX/MSIX 包
- MsiTarget.ts:用于创建 MSI 安装包
- NsisTarget.ts:创建 NSIS 安装程序
Windows 平台打包的核心流程
我们可以通过 Windows 平台打包的核心文件来分析一下核心的流程。WinPackager 类是 electron-builder 中处理 Windows 平台打包的核心类。它继承自 PlatformPackager,专门处理 Windows 相关的打包逻辑。
export class WinPackager extends PlatformPackager<WindowsConfiguration> {
// ...
}
主要有以下几个核心的功能流程:
目标创建
createTargets 方法根据用户配置创建不同的打包目标:
createTargets(targets: Array<string>,mapper: (name: string, factory: (outDir: string) => Target) => void): void {
// ...
for (const name of targets) {
if (name === "nsis" || name === "portable") {
mapper(name, outDir => new NsisTarget(this, outDir, name, getHelper()))
} else if (name === "nsis-web") {
mapper(name, outDir => new WebInstallerTarget(this, path.join(outDir, name), name, new AppPackageHelper(getCopyElevateHelper())))
}
// ... 其他目标类型
}
}
这里支持多种打包格式,如 NSIS、AppX、MSI 等,每种格式对应一个特定的 Target 类,这一部分是非常关键和核心的逻辑,在后面会对每种包的生成做一个详细的讲解。
图标处理
图标处理使用懒加载方式:
_iconPath = new Lazy(() => this.getOrConvertIcon("ico"))
这确保了只在需要时才进行图标转换,优化了性能。
代码签名
签名过程主要通过 sign 和 doSign 方法实现:
async sign(file: string): Promise<boolean> {
const signOptions: WindowsSignOptions = {
path: file,
options: this.platformSpecificBuildOptions,
}
const didSignSuccessfully = await

最低0.47元/天 解锁文章
853

被折叠的 条评论
为什么被折叠?



