介绍
NPM包的发布,一直是一个头疼的问题。问题主要出现在以下几个方面:
- 版本控制
- Changelog日志追溯
- git tag
- 执行npm publish
- 持续集成
- monorepo
Changesets的出现让这一系列问题变得更加简单。
名词介绍
- Semantic Versioning: 版本号规范
- Changesets: NPM发布工具
基础使用
-
添加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文件,参考:github.com/citrus327/r…
以上workflow文件,使用pnpm作为包管理器,若使用yarn则自行修改。
-
当每次有针对
main分支的提交时(且含有changeset),会触发该action,并根据提交的changesets进行分析,并自动提交PR。
该PR会根据changeset信息自动修改npm包版本,添加changeset信息至changelog.md,且删除对应的changeset文件。
- 同意PR之后,action会在再次工作,并检查相对应的changesets, 修改版本号并发布至对应registry。
结果
可参考仓库: github.com/citrus327/r…