有些人会说:publish
模块包,有什么难的?直接npm publish
不就好了么?
其实不然,我们还会有这样的问题:
- 单元测试是否通过?
- 我怎么发测试包?
- 发布之后能否打个tag?
在github
有一个包np,似乎能解决上面的问题。
在一定程度上确实是可以。
第一个问题
按照np
的发包流程,必须要先提交commit
,但有时候,我们只是说想发个测试包给其他小伙伴,因为也不知道是否正确,所以不是很想先commit
。
所以我们必须要实现--no-git
的功能,即当有这个args
的时候,可以绕过np
的规范,进行包的提交。
不过这里有一个建议是,在scripts
里面放两条命令:
{
"scripts": {
"pub:test": "np --no-git",
"pub": "np"
}
}
在发测试包
的时候,用上面那条命令。发正式版本
的时候,用pub
命令。
第二个问题
当选择(确认)了版本号之后,np
会对package.json
的version
修改,并且提交commit
,生成本地tag
。
这个问题会导致,发一个测试包
,最终也会生成一个tag,而且还有commit
提交记录。
那么是什么原因导致的?我找了好久,终于找到罪魁祸首
,刚开始的时候,我都不敢相信:
是的,你没看错:
yarn version --version 版本号
就是做了以下几个事:
- git add
- git commit
- git tag
第三个问题
通常我们做一个规范点的组件包
,都会使用commitizen
。
当然还要结合.commitlintrc
,来规范和约束我们的commit message
。
那么问题来了:
- 怎么修改
yarn version --verion 版本号
的commit message
- 发布的
type
叫什么比较好?
我个人这边给起的type
值是publish
。随后我们找一下文档,发现yarn
有类似的命令是提供出来的:(npm也是可以通过查文档找到)
yarn config set version-git-message "v%s"
第四个问题
如何守护npm publish
命令,就是在当前模块包下,禁用npm publish
,转而使用yarn pub
来发布模块包。
在antd-tools
里面其实有提供guard
的命令,我们简单翻一下源码就可以清楚了,核心是这句话:
看明白了源码,真要发包,也可以通过:
npm publish --with-antd-tools
从np
的角度来看,我们还要想办法传一些类似--with-antd-tools
的标识。
第五个问题
算是第四个问题的延伸,通常第四个问题要守护
的话,做法是这样的:
{
"scripts": {
"prepublish": "antd-tools run guard",
"prepare": "antd-tools run guard",
"prepublishOnly": "antd-tools run guard",
}
}
如果我们想要在publish
前进行build
或者compile
或者执行其他命令,要放在哪里?
当然你可以选择prepublishOnly
命令,通过&&
和守护关联起来。
antd-tools
的做法是通过pre-publish
的命令,在该工具中,publish
执行的时候,就会先运行pre-publish
。
所以我们其实也可以考虑放到np
这个包里面去。当然执行时机是在test
之后,因为test
没有通过,执行build
或者其他的,个人感觉意义不大。
第六个问题
结束了么?不不不,上面所说的只是普通组件发布。
在一些场景下,我们需要使用lerna
来建立多个packages
。
那么问题来了,怎么维护tags
,因为默认的发包tags
是这样的:
我试图从create-react-app
上寻找他们的方案:
OK,那么也就是我们要调整一下下面的这个参数了:
结语
通过对以上六个问题的思考,我们可以明白publish
里面包含了很多很多东西。
有些坑,我们不去踩,永远都不知道这里面有些什么东西。