使用changesets进行npm包发布

介绍

目前在github上发npm包仍靠手动,需要一套较为稳定,可靠(背后有逻辑支持)的发布CI。保证git tag,version, branch, npm publish和github releases的执行。
 
相关文档:
  • Semantic Versioning: 版本号规范

基础使用

  1. 添加changesets工具链
    1. npm install @changesets/cli && npx changeset init
  1. 创建一个changeset
    1. npx changeset
  1. 修改版本
    1. npx changeset version
  1. 发布
    1. npx changeset publish
 

详细解释

  • 问题定义:
    • 当多人协作共同开发一个仓库时,会遇到来自各类的pr或者是同一分支的代码提交。这一系列需要被“发布”的信息单独从PR MR或者Commits信息上去看,略显单薄且无法很好的追溯。git本身也无法存储较为详细的信息。
changesets就是解决以上问题的工具。
 
在使用changesets时,需要将changeset理解为一次改动(intent to change)。一次改动所附带的信息有:
  1. 版本号变更 (符合semver)
  1. Changelog
 
使用npx changeset创建一个changeset后,会要求你输入一段本次变更的summary和期望变更的版本, 并在仓库的.changesets 文件夹内形成一个包含summary的[UNIQUE_ID].md 文件
例如:
|- .changeset |- chilly-ads-learn.md |- package.json
[UNIQUE_ID].md 中会使用头部 frontmatter区域进行各个包的升级描述
--- "package-a": patch "package-b": patch "package-c": patch --- pump all packages to a patch version
 
所以当多个changesets被创建后,会出现多个[UNIQUE_ID].md 文件。changesets会根据这些文件的frontmatter信息核算出一个期望的版本,并再执行完npx changeset version 后变更版本,同时删除这些markdown文件。
 

发布

执行npx changeset publish或者手动执行npm publish即可。
鉴于很多repo基于yarn或者pnpm 的workspace protocol,建议使用对应包管理器的publish命令来更新子包相互依赖的版本号修正功能。
 

Github action CI接入

  1. 保证仓库设置中以下选项选择同意。
notion image
  1. 保证NPM_TOKEN设置完毕。
  1. 新建workflow文件,参考:https://github.com/citrus327/react-lib-starter/blob/main/.github/workflows/release.yml
    1. 以上workflow文件,使用pnpm作为包管理器,若使用yarn则自行修改。
  1. 当每次有针对main 分支的提交时(且含有changeset),会触发该action,并根据提交的changesets进行分析,并自动提交PR。
    1. notion image
      notion image
      该PR会根据changeset信息自动修改npm包版本,添加changeset信息至changelog.md,且删除对应的changeset文件。
  1. 同意PR之后,action会在再次工作,并检查相对应的changesets, 修改版本号并发布至对应registry。