Electron-builder 是如何打包 Windows 应用的?

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

大家好,我是徐徐。今天我们聊聊 electron-builder 中 windows 是如何打包的。

前言

electron-builder 中 windows 的打包其实也是很复杂的,因为光是使用这个工具去打包就会遇到很多问题,更别说去探究里面的源码了解其原理了。但是之前已经写了 electron-builder 中 macOS 的源码和原理解读,然后为了彻底了解所有平台的打包逻辑,我又开始阅读 windows 的构建源码,这里跟大家分享一下我的一些理解。

涉及的核心源码路径

  • winPackager.ts:Windows 平台打包的核心文件

https://github1s.com/electron-userland/electron-builder/blob/master/packages/app-builder-lib/src/winPackager.ts

  • AppxTarget.ts:用于创建 AppX/MSIX 包

https://github1s.com/electron-userland/electron-builder/blob/master/packages/app-builder-lib/src/targets/AppxTarget.ts

  • MsiTarget.ts:用于创建 MSI 安装包

https://github1s.com/electron-userland/electron-builder/blob/master/packages/app-builder-lib/src/targets/MsiTarget.ts

  • NsisTarget.ts:创建 NSIS 安装程序

https://github1s.com/electron-userland/electron-builder/blob/master/packages/app-builder-lib/src/targets/nsis/NsisTarget.ts

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"))

这确保了只在需要时才进行图标转换,优化了性能。

代码签名

签名过程主要通过 signdoSign 方法实现:

async sign(file: string): Promise<boolean> {
   
   
  const signOptions: WindowsSignOptions = {
   
   
    path: file,
    options: this.platformSpecificBuildOptions,
  }
  const didSignSuccessfully = await 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值