使用 pnpm workspace 与 Changesets 版本管理工具
以 @otter-hacker/tooling
项目为例。
如果不想发布根项目目录下的 package.json
,就将根目录的 package.json
设置为私有项目
这样使用 pnpm publish -r
发布时就会跳过这个 package
。
本地命令发布
文档:在 pnpm 中使用 Changesets | pnpm
- 如果开发完一个功能,执行
pnpm changeset
,选择变更的包, 描述此次的改动是什么,这将在.changeset
目录生成 md 文件,需要提交到仓库 - 全部功能开发完毕,需要发布了,执行
pnpm changeset version
,这将消耗之前生成的changeset
md
文件,并生成 CHANGELOG - 执行
pnpm install
,这将更新锁文件并重新构建包。 - 提交更改。
- 运行
pnpm publish -r
。 此命令将发布所有包含被更新版本且尚未出现在包注册源中的包。
详细说明:
当所有变更都准备好之后(push 到远程)首先执行
执行pnpm changeset
之后会弹出交互式命令:
注意这里会首先让你选择哪些软件包应该进行重大更新,选择之后这个包的版本号会进行大版本变化 1.0 → 2.0,回车可以跳过
Which packages should have a major bump? · No items were selected
跳过之后会让你选择哪些软件包应该进行小版本升级?同上,选择之后包的版本号会进行小版本升级 1.0 → 1.1
Which packages should have a minor bump? · No items were selected
如果都不选择,则会自动选择 patch
补丁升级 1.1.0 → 1.1.1
The following packages will be patch bumped:
选择完成后 changeset
会生成一个改动说明文件,在 .changeset
文件夹下,这个文件需要提交到仓库
Changeset added! - you can now commit it
将这些文件保存提交远程后执行 pnpm changeset version
,此命令修改需要发布的包的版本号,并且为每个 package 生成 CHANGELOG
说明文件,**然后执行 pnpm install
更新lock
文件依赖,**将生成的文件提交到仓库。
执行 pnpm publish -r
将发布注册表中尚未存在的已升级版本的所有软件包。
等成功提交后就会在控制台提示了
注意,执行
pnpm publish
之前确保已经登录了npm
账号, 使用npm whoami
可以查看当前登录的npm
账号,否则没有权限提交
Github Action 发布
添加 publish.yml
文件,这个文件每当有代码提交到 main
分支的时候都会执行,会执行 changesets/action@v1
判断 .changeset
文件夹中有没有未消耗的 changeset
文件,有的话会消耗掉这些文件,修改需要发布的 package version 并创建发布 PR
,如果没有的话,就会直接发布到 npm。
官方文档:
在 pnpm 中使用 Changesets | pnpm
详细说明
dev
分支开发完成一个功能,执行pnpm changeset
,选择变更的包, 描述此次的改动是什么,这将在.changeset
目录生成 md 文件,需要提交到仓库- 全部功能开发完毕,将
dev
分支合并到main
触发Github Action
, 此时会自动执行yml
配置中的pnpm run version
命令,也就是pnpm changeset version
, 将会修改变动的包的版本号,以及生成对应的CHANGELOG
日志文件,执行完毕后会创建一个Pull Request
,目标分支为changeset-release/main
,这时候package
还未真正发布到npm
。 Merge Pull Request
,再次触发Github Action
, 这时候会执行changesets/action@v1
,此时.changesets
文件中的更改集已经被pnpm changeset version
命令使用掉,所以No changesets found, attempting to publish any unpublished packages to npm
。未找到任何更改集,尝试将所有未发布的软件包发布到npm。然后会执行pnpm run lint && pnpm publish -r
命令,将 package 发布到 npm 中。
如果报错 The requested URL returned error: 403 没有 Github TOTEN 的权限,需要修改项目的配置设置
如果Action 遇到了 The process '/usr/bin/git' failed with exit code 128
的错误
需要设置 workflow 使用 GITHUB_TOKEN的权限,在仓库的 Setting → Actions → General 下设置 Workflow Permissions,勾选 Read and write permissions 选项 。如果 Action 需要创建 pull requests,则需要将最后的 Allow Github Actions to create and approve pull request 选项也勾选上,否则会报
GitHub Actions is not permitted to create or approve pull requests.
错误
如果是组织项目,则需要在组织的设置中去设置
保存后重新执行失败的Publish Action,如果一切没问题,就会在看到的仓库的 Pull requests 下有了新的 PR:Version Packages
,确认合并当前 PR,会自动运行 Action。运行成功后不出意外就会发布到 Npm 上。
但是,如果是新的仓库,大概率会运行失败,如果出现了下面的错误,则还是权限的错误