跳至主要内容

依赖版本升级

Renovate

我们依靠 renovate 机器人 使用 此配置 自动创建拉取请求来更新我们的依赖项。

依赖项仪表盘

Renovate 被配置为管理一个 依赖项仪表盘问题,它可以用来了解该工具的状态。

  • 哪些依赖升级需要 Renovate 批准才能执行(例如,因为它们是主要升级)
  • Renovate 正在处理哪些依赖升级(即待处理)
  • 目前有哪些依赖升级已打开并等待审查和合并
    • 请注意,Renovate 是一个异步工具,因此此列表在您合并 PR 后会稍微滞后
  • 哪些依赖升级已被忽略

在此问题中勾选复选框将导致 Renovate 执行依赖升级

  • 如果您在“待批准”列表中勾选一个,它将批准它,Renovate 将创建一个 PR。
  • 如果您在“待处理状态检查”列表中勾选一个,它将导致 Renovate 在其内部状态检查完成之前创建 PR。
  • 如果您在“打开”列表中勾选一个,它将导致 Renovate 重新整理 PR(如果没有任何手动更改)或重新创建 PR(如果有手动更改)。
  • 如果您在“已忽略或被阻止”列表中勾选一个,它将导致 Renovate 重新创建 PR。

合并 Renovate PR

Renovate 不会自动合并其依赖 PR,因为我们启用了分支保护。Renovate PR 必须经过与人工 PR 相同的工作流程:即所有 PR 必须在合并之前获得批准并通过状态检查。

如果与main发生冲突,Renovate 将自动更新 PR。您也可以通过在 PR 的描述中勾选复选框或在依赖项仪表板中勾选相关复选框来强制其重新整理 PR。

您通常应该避免在 Github UI 中点击“更新分支”按钮,因为这将创建一个人工提交 - 这会导致 Renovate 将分支视为“脏”,并且它将不再自动执行。只有在您计划尽快手动合并 PR 时才点击它。

手动依赖更新

有时,您可能希望在一个提交中手动更新依赖项,而不是依赖 Renovate 的多个 PR。这样做只是以下步骤:

  1. git checkout main && git pull
  2. yarn install
  3. yarn update-interactive - 这将启动 yarn 的提示以更新依赖项。
    1. 忽略带有* 依赖项的行,因为这些依赖项是故意设置为这样的。
    2. 避免更改依赖项范围,例如我们为 TypeScript 设置的复杂范围(例如 >=4.7.4 <5.5.0)。
    3. 准备就绪后,按enter键,Yarn 将进行更改并重新运行安装。
  4. 在创建 PR 之前,请在本地运行所有相关检查,以便您可以处理任何错误。
    1. yarn build
    2. yarn typecheck
    3. yarn lint
    4. yarn test
    5. yarn integration-test
  5. 创建一个新分支(例如 update-deps-20231201 的名称很好,只是为了保持唯一性),创建并提交一个 PR。

Babel

我们发布的包仅将 @babel/* 包作为 devDependencies。通常,您可以使用以下命令升级这些依赖项:

  1. yarn add -D @babel/code-frame @babel/core @babel/eslint-parser @babel/parser @babel/types
  2. npx nx run ast-spec:test -u

packages/ast-spec/ 下的夹具描述了如何在 Babel 和我们的(TSESTree)解析器下解析文件。

ESLint

typescript-eslint 存储库为 eslint 包包含四种版本的范围

  • 集成测试:固定到我们最低支持的 ESLint 版本
  • 具有 * peerDependency 版本的包:这些包将回退到显式的 peerDependency 版本
  • 具有显式 peerDependency 版本的包:支持的 ESLint 主要版本的完整范围
  • package.jsondevDependency:一个相对较新的版本,仅用于存储库开发
提示

每当您发现任何因降低旧 ESLint 版本而导致的工作区域被阻塞时,例如新的 ESLint API 弃用,请添加一个 TODO 注释,该注释将被 移除对旧 ESLint 版本的支持 下的正则表达式捕获。

添加对新 ESLint 版本的支持

  1. 将根 package.json devDependency 升级到最新的 ESLint
  2. 将新主版本添加到显式 peerDependency 版本中
  3. 检查 eslint-visitor-keys 以查看是否有要升级的新版本。
  4. 更新 用户 > 依赖项版本 > ESLint

移除对旧 ESLint 版本的支持

  1. 将集成测试增加到下一个最低支持的主版本 (*.0.0)
  2. 从具有显式 peerDependency 版本的包中删除旧主版本
  3. 搜索源代码注释(不包括 CHANGELOG.md 文件),这些注释提到了现在不支持的 ESLint 版本。
    • 例如,要删除对 v5 的支持,搜索可能包括
      • /eslint.*5/i
      • /todo.*eslint.*5/i
      • /todo.*eslint/i
  4. 更新 用户 > 依赖项版本 > ESLint

请参阅 chore: drop support for ESLint v6 以供参考。

Node

typescript-eslint 存储库包含三种类型的 Node 版本范围

  • .github/workflows/ci.ymlPRIMARY_NODE_VERSION:设置为我们支持的最高 Node 版本
  • node-version:设置为我们 CI 中的单元测试支持的 [最低,最高] 版本的元组
  • 所有 package.json 中的 engines 字段:显式列出所有支持的 Node 范围

在添加对新 Node 版本的支持或删除对旧 Node 版本的支持时,请相应地更改这些数字。

请参阅 feat: drop support for node v12 + chore: test node v14 on ci.yml 以作参考。

TypeScript

添加对新 TypeScript 版本的支持

我们通常在某个版本的第一个 beta 版本发布后就开始支持该新 TypeScript 版本。

  1. 创建一个并固定一个标题为TypeScript X.Y 支持的问题,并添加accepting prsASTdependenciesNew TypeScript Version标签,以及以下内容

    1. 指向 Microsoft 问题跟踪器中的TypeScript X.Y 迭代计划问题的链接

    2. 以下文本

      This issue is just to track all of the new features and their implementation state in this project.
      As with all releases, we will not necessarily support all features until closer to the full release when everything the features are stabilised.

      _Please be patient._ ❤️
    3. 每个在迭代计划中提到的将影响我们的新 TypeScript 功能的标题都以🔲 开头

    4. 一个标题为🔲 lib.d.ts 更新的标题,内容为我们需要在scope-manager中重新生成我们的类型

    5. 一个标题为其他对我们没有影响的更改的标题,其中包含我们认为不会影响我们的其他更改列表

  2. 在此阶段,可以发送和/或审查实现必要功能的 PR,但请等到新 TypeScript 版本的 RC 发布后再合并它们

    • 每当创建 PR 时,请在其相应的标题中添加 (#1234),并将标题的 emoji 从 🔲 更改为 🏗
    • 搜索expectBabelToNotSupport以了解如何支持 Babel 尚不支持的语法
  3. 一旦 TypeScript RC 版本发布,就开始合并 PR

    • 每当合并 PR 时,请将相应标题的 emoji 从 🏗 更改为 ✅
  4. 创建一个标题为feat: update TypeScript to X.Y-rc的 PR,并进行以下更改

    • 在根目录的package.json中,将|| X.Y.1-rc2添加到typescriptdevDependency
    • 在解析器的 `getLib` 中,根据需要更新 `switch (target)` 及其前面的注释(参见 #6782)。
    • 将 `SUPPORTED_TYPESCRIPT_VERSIONS` 常量的 `<` 版本更改为 TypeScript 的下一个版本。
    • 将 `SUPPORTED_PRERELEASE_RANGES` 常量更改为等于 `['X.Y.1-rc']`。
    • 将 `patches/typescript*` 重命名并更新为新的 TypeScript 版本。
    • 运行 `yarn generate-lib` 更新 `scope-manager`。
  5. 所有 RC 更新 PR 所需的 PR 都合并后,合并 RC 更新 PR。

  6. TypeScript 发布稳定版 X.Y 版本后,创建一个标题为 `chore: bump TypeScript from X.YRC to X.Y` 的 PR 并合并,并进行以下更改:

    • 在根目录的 `package.json` 中,从 `typescript` 的 `dependency` 中删除 `|| X.Y.1-rc2`,并将它的 `<` 版本提升到 TypeScript 的下一个版本。
    • 在根目录的 `package.json` 中,将 `typescript` 的 `resolutions` 更改为 `X.Y.3`。
    • 将 `patches/typescript*` 重命名并更新为新的 TypeScript 版本。
    • 由于 TypeScript 在 RC 版本和稳定版本之间的更改而导致的任何其他必要更改。
  7. 发送一个 PR 来更新此文档页面,以指向您更新的 issue 和 PR。

    • 如果您使用不同的流程,也请更新这些步骤中的任何步骤。

参考(注意:这些步骤不完全遵循此处描述的流程):

移除对旧版 TypeScript 版本的支持

一个 PR 可以将对旧版 TypeScript 版本的支持作为重大更改移除。

  1. 更新根目录的 `package.json` `devDependency`。
  2. 更新 `warnAboutTSVersion.ts` 中的 `SUPPORTED_TYPESCRIPT_VERSIONS` 常量。
  3. 更新 `version-check.ts` 中的 `versions` 常量。
  4. 更新 用户 > 依赖版本 > TypeScript
  5. 更新 `packages/website/src/components/OptionsSelector.tsx` 中的 `MIN_TS_VERSION_SEMVER`。
  6. 搜索源代码注释(不包括 `CHANGELOG.md` 文件),查找提及不再支持的 TypeScript 版本的注释。
    • 例如,要移除对 v4.3 的支持,搜索可能包括
      • 4.3
      • /is.*4.*3/i
      • /semver.*4.*3/i
      • /semver.satisfies/
      • /todo.*ts/i
      • /todo.*typescript/i

参见 feat: bump minimum supported TS version to 4.2.4.