NPM发布大杀器之changesets

1,322 阅读2分钟

介绍

NPM包的发布,一直是一个头疼的问题。问题主要出现在以下几个方面:

  1. 版本控制
  2. Changelog日志追溯
  3. git tag
  4. 执行npm publish
  5. 持续集成
  6. monorepo

Changesets的出现让这一系列问题变得更加简单。

名词介绍

基础使用

  1. 添加changesets工具链

    npm install @changesets/cli && npx changeset init
    
  2. 创建一个changeset

    npx changeset
    
  3. 修改版本

    npx changeset version
    
  4. 发布

    npx changeset publish
    

详细解释

  • 问题定义:

    当多人协作共同开发一个仓库时,会遇到来自各类的pr或者是同一分支的代码提交。这一系列需要被“发布”的信息单独从PR MR或者Commits信息上去看,略显单薄且无法很好的追溯。git本身也无法存储较为详细的信息。

changesets就是解决以上问题的工具。

在使用changesets时,需要将changeset理解为一次改动(intent to change)。一次改动所附带的信息有:

  1. 版本号变更 (符合semver)
  2. 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. 保证仓库设置中以下选项选择同意。 image.png

  2. 保证NPM_TOKEN设置完毕。

  3. 新建workflow文件,参考:github.com/citrus327/r…

    以上workflow文件,使用pnpm作为包管理器,若使用yarn则自行修改。

  4. 当每次有针对main 分支的提交时(且含有changeset),会触发该action,并根据提交的changesets进行分析,并自动提交PR。

image.png

image.png

该PR会根据changeset信息自动修改npm包版本,添加changeset信息至changelog.md,且删除对应的changeset文件。

  1. 同意PR之后,action会在再次工作,并检查相对应的changesets, 修改版本号并发布至对应registry。

结果

可参考仓库: github.com/citrus327/r…