monorepo工作流基础之changesets打开与进阶(Speeches)

文章目录

背景

changesets 是 jira 公司 atlassian 的产品,目前已经转由 changesets 新组织专门维护。

谁在用?

monorepo工作流基础之changesets打开与进阶(Speeches)

先置理论

聊聊工作流

monorepo工作流基础之changesets打开与进阶(Speeches)

workflow 一致性问题

如何达成一致协作的 workflow?

  • 公司内:拉通对齐形成一致合力
  • 开源:github bot + github actions

开源项目的工作流解法

官方推荐自动化解法:Automating Changesets

github bot
  1. 规范开发者行为
    monorepo工作流基础之changesets打开与进阶(Speeches)

  2. 自动生成 release changelog 报告,可控制的统一发版行为 (例子:changesets pull #718
    monorepo工作流基础之changesets打开与进阶(Speeches)

github actions

所以开源项目的 Auto workflow 的解法流程是:

  1. 开发阶段:开发者开发代码,进行 PR ,由 github bot 规范保证提交变更集,此处附带了:

    a. 单次变动的 changelog
    b. 影响 version 程度

  2. 收集阶段:项目 owner 收集 approve 需要的 PR ,此时 github bot 会以一个 PR 为形式,积累所有变动的发版 PR 。内包含了:

    a. 项目 release changelog
    b. 每个子包的 version 变化
    c. 每个子包的 changelog

  3. 发版阶段:经过一段时间,收集足够 PR (变更集) 后,项目 owner 合并 github bot 提出的发版 PR ,由 github actions 自动发版,此处会进行:

    a. 自动发版至 npm
    b. 每个子包接收 changelog 附加、version 变化

实践赋能

安装 changesets

  # 安装 changesets
  pnpm add -W -D @changesets/cli

  # 初始化 changesets 文件夹
  npx changeset init

配置 changestes

配置 .changeset/config.json

{
  "$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
  
  // changelog 生成方式
  "changelog": "@changesets/cli/changelog",
  // 开源项目可用 github 格式的 changelog,会附带 commit link
  // "changelog": ["@changesets/changelog-github", { "repo": "changesets/changesets" }]
  
  // 不要让 changeset 在 publish 的时候帮我们做 git add
  "commit": false,
  
  // 配置哪些包要共享版本
  // 参考1:https://github.com/changesets/changesets/blob/main/docs/config-file-options.md#linked-array-of-arrays-of-package-names
  // 参考2:https://github.com/changesets/changesets/blob/main/docs/linked-packages.md#using-glob-expressions
  "linked": [],
  
  // 公私有安全设定,内网建议 restricted ,开源使用 public
  "access": "restricted",
  
  // 项目主分支
  "baseBranch": "origin/main",
  
  // 确保某包依赖的包发生 upgrade,该包也要发生 version upgrade 的衡量单位(量级)
  // https://github.com/changesets/changesets/blob/main/docs/config-file-options.md#updateinternaldependencies
  "updateInternalDependencies": "patch",
  
  // 不需要变动 version 的包
  "ignore": [],
  
  // 在每次 version 变动时一定无理由 patch 抬升依赖他的那些包的版本,防止陷入 major 优先的未更新问题
  "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
    // https://github.com/changesets/changesets/blob/c68536edf4c04e7fdf5594ec9c69471cd86fd0ce/packages/assemble-release-plan/src/determine-dependents.ts#L88
    "updateInternalDependents": "always"
  }
}

各个选项介绍可直接参看官方文档说明,这里给出两份不同场景的推荐解法:

业务项目

{
  "$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
  "changelog": "@changesets/cli/changelog",
  "commit": false,
  "linked": [],
  "access": "restricted",
  "baseBranch": "origin/main",
  "updateInternalDependencies": "patch",
  "ignore": [],
  "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
    "updateInternalDependents": "always"
  }
}

开源项目

{
  "$schema": "https://unpkg.com/@changesets/config@1.6.1/schema.json",
  // ⬇️ 这里和业务的配置不一样~
  "changelog": ["@changesets/changelog-github", { "repo": "owner/repo" }],
  "commit": false,
  "linked": [],
  // ⬇️ 这里和业务的配置不一样~
  "access": "public",
  "baseBranch": "origin/main",
  "updateInternalDependencies": "patch",
  "ignore": [],
  "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
    "updateInternalDependents": "always"
  }
}

修改 packages.json

修改项目根目录的 package.json

// package.json

// 新增
"scripts": {
    // 构建整个项目的产物
  	"build": "pnpm -r --filter ./packages run build",
    
    // 1. 开始交互式填写变更集
    "changeset": "changeset",
      
    // 2. 用来统一提升版本号
    "version-packages": "changeset version",
     
    // 3. 构建产物后发版
    "release": "pnpm build && pnpm release:only",
    "release:only": "changeset publish --registry=https://registry.npmjs.com/"
}

// 新增
"publishConfig": {
  "access": "public"
}

这里同样给出两种不同场景的解法:

业务项目

// package.json

"scripts": {
  	"build": "pnpm -r --filter ./packages run build",
  
  	// ⬇️ 由于需要频繁使用,本地用更短的命令来节省成本 
上一篇:Go-Web相关知识总结


下一篇:【TcaplusDB知识库】RESTfulAPI. for Generic表-[PB] FieldGetRecord介绍