准备工作
全局安装pnpm
$ npm i pnpm -g
安装changesets
$ pnpm i @changesets/cli -Dw
初始化
- 创建项目
$ mkdir my-project
$ mkdir my-project/packages
$ pnpm init
- 指定
packages范围
创建pnpm-workspace.yaml,并添加如下内容:
packages:
- "packages/*"
- 添加
package
在packages目录下新建项目(如:pkg1、pkg2)
package没有特别的规则,遵循 npm标准就行
- 初始化
changeset
$ pnpm changeset init
执行命令后会在根目录生成.changeset/conifg.json文件,里面是changeset的相关配置
{
"$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json",
"changelog": "@changesets/cli/changelog", //更新日志生成函数的加载地址
"commit": true, //自动提交version的改动
"fixed": [], //捆绑发布的包
"linked": [],//设定版本保持一致的包
"access": "public", //公开,如果你想阻止一个包被发布到npm,在包的package.json中设置private: true (可选值:restricted,不公开)
"baseBranch": "master", //主分支名
"updateInternalDependencies": "patch", //是否主动更新package的依赖,patch、minor
"ignore": [] //指定不发布的包
}
添加依赖
添加三方依赖
$ pnpm i axios -C packages/packageA #包路径为packages/packageA的包添加axios
$ pnpm i axios --filter packageName #给包名(package.json中那name字段)为packageName的包添加axios依赖
$ pnpm i axios -w #将axios安装到根目录
如果是本地的包相互依赖,可以使用workspace协议安装,例如包pkg1依赖本地的pkg2
$ pnpm i pkg2@workspace --filter pkg1
版本管理
当修改了某个或者几个包,需要在发布之前通过changesets更新版本号:
$ pnpm changeset add #选择需要修改版本的包
如果想更换版本号升级类型:
major、minor、patch,在第一次选择完包名之后(如下图)按回车健而不是空格键
根据提示选择,之后会在.changeset目录下生成修改日志文件
---
"@super-poster/pkg1": major
"@super-poster/pkg2": major
---
修改日志信息
该文件描述了执行changeset version之后将被更改的包以及版本号升级了类型和修改的提交message
我们也可以修改这个文件,达到我们的需求,例如讲
major修改更patch,那么将更新第三位版本号(如:v0.0.1 -> v0.0.2),一般操作无误的情况下,我们是无需修改这个更新文件的
选择完要修改版本的包之后,将修改提交到git,然后执行changese version命令更新版本
$ pnpm changeset version
执行完上面的命令之后,选择的包的版本号将会被更新,确认无误之后发布到npm
pnpm publish -r
发布过程可能会遇到下面这些问题
- 1、包访问类型导致发布失败,类似如下报错:
npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in to https://registry.npmmirror.com/
npm ERR! need auth You need to authorize this machine using `npm adduser`
这是因为,组织下的包默认是私有包,需要收费的,需要手动配置称公共包,在packagea/package.json中加入如下配置
{
"name":"packagea",
"publishConfig": {
"registry": "https://registry.npmjs.org/",
"access": "public"
},
}
- 2、包名问题导致发布失败,如下:
RR! E400 "packageName" is invalid for new packages
npm包名用下划线来分割,避免使用小驼峰,将packageName换成package_name
如未遇到如上问题,则根据提示设置版本号确认push即发布成功~
最后,附上demo