前言
作为一名合格的前(摸鱼)工程师,日常工作开发中或多或少都要和npm
包打交道。之前工作中就有过发布npm
包的经历,但那时年少无知,只知道无脑通过npm publish
发包,也没有打 tag
、版本、没生成 changelog
的概念。直到看到源码共读中有自动发包章节,还可以自动打tag
等功能,赶紧收藏学习起来。
前置准备
要在npm
上发包,当然需要在npm
上注册账号,这个就不再赘述。我们在注册完账号之后,先设置一下镜像源,再登录自己的npm
账号。如果有同学和我一样,使用的是公司内部私有的npm
服务器,使用的账号和镜像源都是公司提供的,不要弄混淆,下面我们开始具体步骤。
准备项目文件
首先创建一个文件夹,然后执行npm init -y
初始化我们的项目
设置镜像源
如果是在已有项目中接入,最好要查看一下当前项目镜像源,初始化项目可以跳过。
那为什么要设置镜像源呢?装过npm
包的同学都知道,npm
官方public
仓库是部署在国外,使用官方镜像源装包速度很慢,所以我们有时候会将镜像源设置为https://registry.npm.taobao.org
,也就是淘宝镜像。这个时候如果我们使用npm
的账号是无法登录的,或者是说你把镜像设置为公司内部私有的镜像源,这个时候通过官方npm
账号也是无法登录的,曾经我就在这里踩过坑。在哪注册的账号,需要将镜像源设置为注册地的仓库。这里我们使用npm
官方镜像源,将镜像源设置为https://registry.npmjs.org
1 | 查看当前镜像源 |
另外一种设置镜像源方式,可以在项目根目录中新建.npmrc
文件
1 | registry = https://registry.npmjs.org/ |
登录npm
使用npm
注册的账号密码登录
1 | 登录 |
自动发包
release-it
它做了什么?
- 同步提交
git
远端内容 - 更新版本号
- 产出
changelog
- 提交变动
- 增加
git tag
- 推送tag更新至远端
我们可以通过--dry-run
可以看到具体进行了哪些操作
自动发包
安装
1 | ➜ npm init release-it |
or
1 | ➜ npm install -D release-it |
添加命令
1 | "scripts": { |
配置
在项目根目录创建文件
.release-it.json
.release-it.js
.release-it.yaml
.release-it.toml
或者是在pakcage.json
文件中添加release-it
属性,这里我就直接创建.release-it.json
文件,添加以下配置或者可以查看
更多配置
1 | { |
生成CHANGELOG
安装插件
1 | ➜ npm i @release-it/conventional-changelog -D |
然后将以下内容添加到.release-it.json
文件中
1 | { |
自动发布
运行命令,就可以进行发布
1 | ➜ npm run release |
将release-it
参数放在--
后面
1 | npm run release --minor --ci |
发布其他版本
npm版本号
这里先初步补充一下npm
版本号相关知识,npm
的版本号遵循SemVer 规范,版本号格式必须采用X.Y.Z的格式,其中 X、Y 和 Z 为非负的整数。X 是主版本号、Y 是次版本号、而 Z 为修订号,英文对应表示为 major、minor、patch,每个号必须采用递增。
1 | X.Y.Z ===> {major}.{minor}.{patch} |
这种格式都是正式版,而在正式版发布之前还会经历各种先行版本,先行版本号会在原有的基础上增加一个版本号标签,先行版本格式是在修订版本patch号后面加上一个-
连接,再通过.
进行分割
1 | # 格式 |
通常第一个 identifier
为版本号标签,后面则是自增版本号。
常用的版本号标签有
alpha
内部测试版beta
公开测试版rc
候选版本
发布先行版本
理解完npm
版本号相关知识后,那如何发布alpha、beta、rc
版本呢?
我们可以看一下pre-releases ,就是通过不同的命令去创建发布不同的版本,比如我现在需要发布beta
版本,就可以执行一下命令。
1 | ➜ npx release-it major --preRelease=beta |
beta
可以换成"alpha", "beta", "rc"
major
可以替换成major、minor、patch
预发布版本在更改的过程中,原有的先行版本号会清零。比如我从1.2.1-alpha.4
升级到beta
版本,就会变成1.2.1-beta.0
升级版本时,会将预发布版本清空,此时版本号不会变动。比如我上一个版本是3.0.0-rc.2
,当我直接升级patch
号就会变成3.0.0
升级当前预发布版本
1 | ➜ npx release-it --preRelease |
将alpha
版本修改为beta
版本
1 | ➜ npx release-it --preRelease=beta |
升级major、minor、patch版本号
1 | ➜ npx release-it major/minor/patch |
当我们发布完后,需要使用到预发布版本依赖事,安装包的时候包名后面要带上@beta
或者是其他版本
1 | npm install release-it-test-wakaka@beta -D |
我们也可以将命令拆分开来使用
1 | # 只响应package.json中的版本号 |
查看包
我们发布完之后,如何查看自己是否发布成功呢?有以下几种方式
npm官网查看
可以在npm
官网上直接搜索包的名字,或者是登录账号后在packages
中查看自己发布的包
在versions
中可以看到历史的版本
使用npm view
命令
1 | # 查看某个 package 的注册信息 |
直接安装
简单粗暴,直接通过npm install <package-name>
安装一下包,如果发布成功,安装时最好另起项目,不要在当前包项目中安装。
踩坑
包名重复
发包前,最好确认一下包名有没有重复,如果包名重复是无法发布的。校验包名最简单的办法就是去npm
官网上搜你需要发布的名字,如果有就需要换一个名字,没有就可以发布。
错误的包名,无法发布
修改后,发布成功
没有git仓库提交代码
在安装完@release-it/conventional-changelog
后,如果没有在git
远程仓库提交代码,也是会发布失败
添加远程仓库后
当我们改完代码后,需要进行提交。
1 | git add . |
changelog文件没有commit信息
为什么我提交了commit,但是生成的changelog中没有commit信息?
这是因为提交的commit信息不符合angular
规范,在.release-it.json
文件中我们可以看到
1 | ... |
只要提交的规范符合angular
规范,就可以了。
@release-it/conventional-changelog
总结
release-it
使用下来,发现它帮我们节省了很多时间,整体发包流程都很规范。之前工作中进行发包的时候,直接一个npm publish
就完事,也没有考虑到打tag
、生成changelog
这些事情。还有更多扩展性功能等待发现,比如配合上commitizen
等工具,自定义commit
信息,让changelog
内容更丰富。配合git hooks,执行其他的一些操作。
同类型的产品还有standard-version,也是提供自动化发包流程,但整体来说还是release-it
更灵活一些。
参考文章