跳至主要内容

Electron 版本控制

详细了解我们的版本控制策略和实现。

从 2.0.0 版本开始,Electron 遵循 SemVer 规范。以下命令将安装 Electron 的最新稳定版本

npm install --save-dev electron

要更新现有项目以使用最新的稳定版本

npm install --save-dev electron@latest

版本控制方案

与我们的 1.x 策略相比,有几个重大变化,如下所述。 每个更改都旨在满足开发人员/维护人员和应用程序开发人员的需求和优先级。

  1. 严格使用 SemVer 规范
  2. 引入符合 semver 的 -beta 标签
  3. 引入 约定式提交消息
  4. 定义良好的稳定分支
  5. main 分支是无版本的;只有稳定分支包含版本信息

我们将详细介绍 git 分支的工作方式、npm 标签的工作方式、开发人员应该看到什么以及如何反向移植更改。

SemVer

下表明确地将更改类型映射到它们对应的 SemVer 类别(例如,主要、次要、补丁)。

主版本增加次版本增加补丁版本增加
Electron 破坏性 API 更改Electron 非破坏性 API 更改Electron 错误修复
Node.js 主版本更新Node.js 次版本更新Node.js 补丁版本更新
Chromium 版本更新与修复相关的 chromium 补丁

有关更多信息,请参阅语义版本控制 2.0.0 规范。

请注意,大多数 Chromium 更新将被视为破坏性的。可以反向移植的修复程序很可能会被精选为补丁。

稳定分支

稳定分支是与 main 并行运行的分支,仅接收与安全或稳定性相关的精选提交。 这些分支永远不会合并回 main

Stabilization Branches

自 Electron 8 以来,稳定分支始终是 版本线,并根据以下模板 $MAJOR-x-y 命名,例如 8-x-y。 在此之前,我们使用版本线并将其命名为 $MAJOR-$MINOR-x,例如 2-0-x

我们允许同时存在多个稳定分支,每个受支持的版本一个。 有关支持哪些版本的更多详细信息,请参阅我们的 Electron 发布 文档。

Multiple Stability Branches

较旧的行将不受 Electron 项目的支持,但其他组可以自行承担所有权并反向移植稳定性和安全修复。 我们不鼓励这样做,但认识到这让许多应用开发人员的生活更轻松。

Beta 版本和错误修复

开发人员想知道哪些版本可以 安全 使用。 即使看似无辜的功能也可能会在复杂的应用程序中引入回归。 同时,锁定到固定版本是危险的,因为您忽略了自您的版本以来可能出现的安全补丁和错误修复。 我们的目标是允许 package.json 中使用以下标准 semver 范围

  • 使用 ~2.0.0 只允许与您的 2.0.0 版本相关的稳定或安全修复。
  • 使用 ^2.0.0 允许非破坏性的合理稳定的功能工作以及安全和错误修复。

关于第二点,重要的是使用 ^ 的应用程序仍然应该能够期望合理的稳定性水平。 为了实现这一点,SemVer 允许使用预发布标识符来指示特定版本尚未安全稳定

无论您选择什么,由于破坏性更改是 Chromium 的事实,您都需要定期增加 package.json 中的版本。

过程如下

  1. 所有新的主要和次要版本线都以 beta 系列开始,由 beta.N 的 SemVer 预发布标签指示,例如 2.0.0-beta.1。 在第一个 beta 之后,后续 beta 版本必须满足以下所有条件
    1. 此更改向后兼容 API(允许弃用)
    2. 满足我们的稳定性时间表的风险必须很低。
  2. 如果允许的更改需要在版本为 beta 后进行,则会应用它们并增加预发布标签,例如 2.0.0-beta.2
  3. 如果某个特定的 beta 版本被普遍认为是稳定的,则会将其重新发布为稳定版本,仅更改版本信息。 例如 2.0.0。 在第一个稳定版本之后,所有更改都必须是向后兼容的错误或安全修复。
  4. 如果将来需要对版本进行稳定后进行错误修复或安全补丁,则会应用它们并增加补丁版本,例如 2.0.1

具体来说,以上意味着

  1. 在 beta 周期的第 3 周之前允许非破坏性 API 更改是可以的,即使这些更改有可能导致中等副作用。
  2. 允许在 beta 周期的最多时间点进行不会改变现有代码路径的功能标记更改是可以的。 用户可以在其应用程序中显式启用这些标记。
  3. 在 beta 周期的第 3 周之后允许任何类型的功能是 👎,如果没有非常好的理由。

对于每个主要和次要的增加,您都应该看到如下内容

2.0.0-beta.1
2.0.0-beta.2
2.0.0-beta.3
2.0.0
2.0.1
2.0.2

图片中的示例生命周期

  • 创建一个包含最新功能集的新发布分支。 它以 2.0.0-beta.1 发布。 新发布分支
  • 一个错误修复进入主分支,可以反向移植到发布分支。 应用该补丁,并以 2.0.0-beta.2 的形式发布新的 beta。 错误修复反向移植到 Beta
  • 该 beta 被认为普遍稳定,并以非 beta 版本在 2.0.0 下再次发布。 从 Beta 到稳定
  • 稍后,会发现一个零日漏洞,并将修复程序应用于主分支。 我们将修复程序反向移植到 2-0-x 行并发布 2.0.1安全反向移植

一些示例说明了各种 SemVer 范围将如何获取新版本

Semvers and Releases

反向移植请求流程

所有受支持的发布线都将接受外部拉取请求,以反向移植以前合并到 main 的修复程序,尽管对于某些较旧的受支持的行,这可能需要具体情况具体分析。 关于发布线反向移植的所有有争议的决定将由发布工作组在反向移植 PR 提出的那一周的每周会议上作为议程项目解决。

功能标记

功能标记是 Chromium 中的常见做法,并且在 Web 开发生态系统中已得到充分建立。 在 Electron 的上下文中,功能标记或 软分支 必须具有以下属性

  • 它在运行时或构建时启用/禁用; 我们不支持请求范围的功能标记的概念
  • 它完全分割了新旧代码路径; 重构旧代码以支持新功能违反了功能标记协议
  • 功能标记在功能发布后最终被删除

语义提交

所有拉取请求都必须遵守 Conventional Commits 规范,总结如下:

  • 会导致 SemVer major 版本号提升的提交,其正文必须以 BREAKING CHANGE: 开头。
  • 会导致 SemVer minor 版本号提升的提交,必须以 feat: 开头。
  • 会导致 SemVer patch 版本号提升的提交,必须以 fix: 开头。

electron/electron 仓库还强制使用 squash 合并,因此你只需要确保你的拉取请求具有正确的前缀标题即可。

带版本号的 main 分支

  • main 分支的 package.json 中将始终包含下一个主要版本 X.0.0-nightly.DATE
  • 发布分支永远不会合并回 main 分支。
  • 发布分支的 package.json确实包含正确的版本号。
  • 一旦为某个主要版本创建了发布分支,main 分支必须提升到下一个主要版本(即,main 分支始终以下一个理论上的发布分支进行版本控制)。

历史版本控制 (Electron 1.X)

Electron < 2.0 版本不符合 SemVer 规范:主要版本对应于最终用户 API 的更改,次要版本对应于 Chromium 的主要版本发布,而补丁版本对应于新功能和错误修复。 虽然这对于合并功能的开发人员来说很方便,但它为面向客户端的应用程序的开发人员带来了问题。 像 Slack、Teams、Skype、VS Code 和 GitHub Desktop 这样的大型应用程序的 QA 测试周期可能很长,并且稳定性是一个非常期望的结果。在尝试吸收错误修复的同时采用新功能存在很高的风险。

这是一个 1.x 策略的示例

1.x Versioning

使用 1.8.1 开发的应用程序,如果不吸收 1.8.2 的功能,或者不回溯修复并维护新的发布线,就无法使用 1.8.3 的错误修复。