最近在搞一个新的库,遇到了些需求:
- 版本发布心智成本高。得确定哪些库要发!手动发布麻烦!
- changelog 维护麻烦
- tag 经常忘记打
- beta 版本发布麻烦。
最终找到了 changesets,这里分享总结给大家。
在没遇到 changesets 之前,你可能听说过。
- lerna。已经不维护了。github.com/lerna/lerna
- standard-version。也不维护了。github.com/conventiona…
- release-please。 standard-version 推荐。根据 conventional commit 来生成 changelog.md。
release-please
关于 conventional commit ,见这里 www.yuque.com/liyatang/he…。
第一个想到的是依赖 conventional commit 来生成 changeog.md 靠不靠谱?
个人觉得提交规范是合理的,比如 feat: xxxxx 可以生成一条 changelog 记录,同时应该发布一个 minor 版本。比如 fix: xxx 可以生成一条 changeog 记录,同时应该发布一个 patch 版本。
如果 commit 错了,那么需要通过修改 commit。
但是我日常开发是比较多 commit 的,可能一个功能我需要 commit 多次,对应 changelog只需要一个即可。
所以我认为通过 conventional commit 来生成 changelog 是理想的。不予采纳。之后没有深入了解 release-please 了。
changesets
A way to manage your versioning and changelogs with a focus on monorepos。
pnpm 和 mobx 都在用 changesets。
综合看下来,选择 changsets 的原因是
- 不耦合 conventinoal commit,版本信息独立维护,通过
npx changeset录入。 - 更多控制权在用户手里,不黑盒。
- github action。
缺点
- 似乎维护不够积极。目前看到 issues 294 个,Pull Requests 79 个。
Demo
这是我的一个 demo,请结合看 github.com/liyatang/te…
初始化
npx changeset int
npx changeset init 生成 .changeset文件夹。其中
- config.json 是 changeset 的配置文件
- xxxx.md 是多个 md 文件,记录 changelog 和 version。供后面真正变更版本使用
add workflows
添加文件 .github/workflows/release.yml,内容参考 github.com/liyatang/te…。
name: Release
on:
push:
branches:
- main
# 并行
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout Branch
uses: actions/checkout@v3
- name: Setup Node.js 18.x
uses: actions/setup-node@v3
with:
node-version: 18.x
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install Dependencies
run: pnpm install
- name: Changesets Version & Publish to npm
id: changesets
uses: changesets/action@v1
with:
version: pnpm ci:version
publish: pnpm ci:release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Send Notification if a publish happens
if: steps.changesets.outputs.published == 'true'
uses: chf007/action-wechat-work@master
env:
WECHAT_WORK_BOT_WEBHOOK: ${{secrets.WECHAT_WORK_BOT_WEBHOOK}}
with:
msgtype: text
content: ${{steps.changesets.outputs.publishedPackages}}
add secrets.NPM_TOKEN
申请 npm token docs.npmjs.com/creating-an…
然后设置即可
设置 action 权限
设置更多权限,以便提交 tag 和 创建 PR。
工作流
1 开发
- main 切分支 feature_xxx or hotfix_xxx
- 日常变更
- 记录变更
npx changeset,选择包和版本和记录 changelog。会在.changeset下生成 md 文件。可多个。 - git commit 提交变更
2 发布确认
- 提交 PR(merge into main from xxx)
-
- review 日常变更
- review 变更记录。
.changeset下的 md 文件(如果不满意需改动)
- Merge
3 发布
- Merge 后触发 github action,执行以下操作
-
- 生成 CHANGELOG.md 和 package version
- 提交 PR(merge into main from changeset-release/main)
- 再次 Merge 后触发 github action,执行以下操作
-
- 调整 workspace 版本依赖
- 发布到 npm & github release
- 打 tag 并推送到 github
- notification
工作流思维导图如下
资料
- changesets github.com/changesets/
- github action github.com/changesets/…
- Changesets: 流行的 monorepo 场景发包工具 zhuanlan.zhihu.com/p/427588430
- pnpm 介绍 changesets pnpm.io/zh/using-ch…
- github action of pnpm cache github.com/pnpm/action…
- weichat action github.com/chf007/acti…