你真的懂`npm publish`?

10,349 阅读3分钟

有些人会说:publish模块包,有什么难的?直接npm publish不就好了么?

其实不然,我们还会有这样的问题:

  • 单元测试是否通过?
  • 我怎么发测试包?
  • 发布之后能否打个tag?

github有一个包np,似乎能解决上面的问题。

alt

在一定程度上确实是可以。

第一个问题

按照np的发包流程,必须要先提交commit,但有时候,我们只是说想发个测试包给其他小伙伴,因为也不知道是否正确,所以不是很想先commit

所以我们必须要实现--no-git的功能,即当有这个args的时候,可以绕过np的规范,进行包的提交。

不过这里有一个建议是,在scripts里面放两条命令:

{
   "scripts": {
       "pub:test": "np --no-git",
       "pub": "np"
   }
}

在发测试包的时候,用上面那条命令。发正式版本的时候,用pub命令。

第二个问题

当选择(确认)了版本号之后,np会对package.jsonversion修改,并且提交commit,生成本地tag

这个问题会导致,发一个测试包,最终也会生成一个tag,而且还有commit提交记录。

那么是什么原因导致的?我找了好久,终于找到罪魁祸首,刚开始的时候,我都不敢相信:

alt

是的,你没看错:

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的命令,我们简单翻一下源码就可以清楚了,核心是这句话:

alt

看明白了源码,真要发包,也可以通过:

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是这样的:

alt

我试图从create-react-app上寻找他们的方案:

alt

OK,那么也就是我们要调整一下下面的这个参数了:

alt

结语

通过对以上六个问题的思考,我们可以明白publish里面包含了很多很多东西。

有些坑,我们不去踩,永远都不知道这里面有些什么东西。