使用changesets进行npm包发布
介绍
目前在github上发npm包仍靠手动,需要一套较为稳定,可靠(背后有逻辑支持)的发布CI。保证git tag,version, branch, npm publish和github releases的执行。
相关文档:
- Semantic Versioning: 版本号规范
基础使用
- 添加changesets工具链
npm install @changesets/cli && npx changeset init
- 创建一个changeset
npx changeset
- 修改版本
npx changeset version
- 发布
npx changeset publish
详细解释
- 问题定义:
当多人协作共同开发一个仓库时,会遇到来自各类的pr或者是同一分支的代码提交。这一系列需要被“发布”的信息单独从PR MR或者Commits信息上去看,略显单薄且无法很好的追溯。git本身也无法存储较为详细的信息。
changesets就是解决以上问题的工具。
在使用changesets时,需要将changeset理解为一次改动(intent to change)。一次改动所附带的信息有:
- 版本号变更 (符合semver)
- 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接入
- 保证仓库设置中以下选项选择同意。
- 保证NPM_TOKEN设置完毕。
- 新建workflow文件,参考:https://github.com/citrus327/react-lib-starter/blob/main/.github/workflows/release.yml
以上workflow文件,使用pnpm作为包管理器,若使用yarn则自行修改。
- 当每次有针对
main
分支的提交时(且含有changeset),会触发该action,并根据提交的changesets进行分析,并自动提交PR。
该PR会根据changeset信息自动修改npm包版本,添加changeset信息至changelog.md,且删除对应的changeset文件。
- 同意PR之后,action会在再次工作,并检查相对应的changesets, 修改版本号并发布至对应registry。