前提
- 本文参加了由川佬@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第39期链接
过程记录
- 创建远程registry,选择License:MIT
- 安装
yarn add release-it -D
- 添加脚本
- 运行npm init release-it, 生成 .release-it.json 增加配置文件
{
"github": {
"release": false
},
"git": {
"commitMessage": "release: v${version}"
},
"npm": {
"publish": false
},
"hooks": {
"after:bump": "echo 更新版本成功"
},
"plugins": {
"@release-it/conventional-changelog": {
"preset": "angular",
"infile": "CHANGELOG.md"
}
}
}
- 安装changlog插件---规范生成change-log
npm i @release-it/conventional-changelog -D
npm i -D git-cz
- 运行
学习
1. commitizen
- 链接
- 介绍:基于Node.js的git commit 命令行工具,辅助生成规范的commit message
配置
- 安装
npm i -D commitizen
- package.json配置commitizen的path路径
作用: 告诉commitizen提交时使用哪种适配器
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
友好配置
# npm
commitizen init cz-conventional-changelog --save-dev --save-exact
# yarn
commitizen init cz-conventional-changelog --yarn --dev --exact
# pnpm
commitizen init cz-conventional-changelog --pnpm --save-dev --save-exact
手动安装cz-conventional-changelog
配置就可以修改成为
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
}
适配器 adapter
更换commitizen的交互方式插件
cz-conventional-changelog(官方的适配器)
执行
安装commitizen后,一般使用git cz或者cz命令代替git commit。
当然也可以使用git-cz,命令依旧是cz但是需要去安装这个依赖
全局安装
npm i -g commitizen
- 优点: 任何项目下都可以使用
cz、git cz命令启动命令行工具
git-cz
- git-cz npm库
commitizen的适配器
使用
- 全局安装独立使用
npm i -D git-cz //安装
git-cz //执行
- 和Commitizen一起使用
npm install -g commitizen //安装commitizen
package.json配置
{
"config": {
"commitizen": {
//新增commitizen配置
"path": "git-cz"
}
}
}
- 使用方式
npx git-cz
// 如果配合commitizen
npx git cz 或者 npx cz就可以了
- 效果
- 确定commit的类型
- 对改动进行简短的一个描述
- 对改动进行长的描述
- 列出破坏性的改变
- 使用该commit信息 关闭某条issue
cz-git
使用都大差不差,看配置就行了
2. release-it
- release-it github
基本介绍
- 作用 控制 包版本管理和发布
- 功能
使用
安装配置
npm init release-it
一般release-it会生成默认的配置,如果需要重新配置的话,将在以下这两个地方进行配置
- 选择 .release-it.json 进行配置,根目录下需要添加.release-it.json文件
.release-it.json
{
"github": {
"release": false //是否开启git仓库release
},
"git": {
"commitMessage": "release: v${version}"//更新版本时 git需要提交package.json的变更,
},
"npm": {
"publish": false //是否需要在npm发布
},
"hooks": {
"after:bump": "echo 更新版本成功"//hook在提升版本后执行该hook
},
}
- 或者选择在package.json中配置
{
"name": "my-package",
"devDependencies": {
"release-it": "*"
},
"release-it": {
"github": {
"release": true
}
}
}
踩坑记录
- release-it有功能为在npm上发布包, 因此需要确定登录npm,否则会出现报错,跟着指令进行npm login。
- 注意 本地源得是 npm官方registry.npmjs.org/ (npm config get/set registry)
- release执行时,本地需要没有更改文件,否则会报错
- 想要发布的包在npm中已经存在, 并且配置该option就可能会报错
"npm": {
"publish": true
},
- 本地分支名称和远程分支名称不匹配(需要建立关联--set-upstream)
执行结果
- 执行选择
- 选择发布的版本
关于版本号 ‘0.0.1’对应 major,minor,patch
后续会自动识别版本号,就不会出现该选项了,增加相应的配置就可以重新选择
"plugins": {
"@release-it/conventional-changelog": {
"preset": "angular",
"header": "# Changelog",
"infile": "CHANGELOG.md",
//增加配置
"ignoreRecommendedBump": "true"
}
}
- 需要将package.json中修改version字段的 改动提交到git
- 打tag
- 是否将更改的内容push到远程git
- 是否发布到npm
- 有关git更新
package.json中version版本更新, 并且同步了远端
可以看到.release-it.json中的配置(git commit message)生效, 还有打的tag也存在
查看相关内容
- 查看changelog
npx release-it --changelog
- 查看下一个该发布的版本号
npx release-it --release-version
3. CHANGELOG
虽然上面的release-it执行时控制台会显示变更多日志, 但是没有写入到CHANGELOG.md文档中
- CHANGELOG.md
在项目根目录下创建该文件
- 日志自动更新生成插件
npm i @release-it/conventional-changelog -D
- .release-it配置plugins
"plugins": {
"@release-it/conventional-changelog": {
"preset": "angular",//应用预设
"infile": "CHANGELOG.md", //写入文件
"header":"# Changelog" //changelog中显示的头部信息,
//示例 可忽略
"preset": {
//只有feat和fix标识的变更才会被记录到changelog.md中
"types": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "chore", "hidden": true },
{ "type": "docs", "hidden": true },
{ "type": "style", "hidden": true },
{ "type": "refactor", "hidden": true },
{ "type": "perf", "hidden": true },
{ "type": "test", "hidden": true }
],
"ignoreRecommendedBump": "true" //重新选择需要的版本
}
}
}
执行开始
将新增加的changelog插件 进行git-cz之后,运行release-it
- 结果
changelog.md自动更新
4. 发布
- 可以自己手动发布
npm publish目前最新的一个版本
- 报错 :该包名已经存在,更新包名后重新执行run release
- 通过release-it的配置项进行发布
最后release执行完成会生成对应的链接,点击release连接就可以跳转页面,生成git release版本
- 结果
5. npm init release-it 和 npx create-release-it区别
npm init原理
从官网可以看出 npm init release-it === npx release-it
npm init <package-spec> (same as `npx <package-spec>)
npm init <@scope> (same as `npx <@scope>/create`)
aliases: create, innit
- npx作用
利用本地包运行命令,如果本地没有就会去远程下载包,并执行命令。
由此可知,npx create-release-it 是会去下载这个包,并且执行命令
- 安装npm包查看
npm i create-release-it -D
bin字段
- package.json
一般一个nmp包可以一个或多个可以执行的命令(create-release-it), 因此有对应的可执行文件(index.js)。
bin字段是命令名(create-release-it)到本地文件名的映射。
在npm包被安装时,这个可执行文件就会被链接到当前项目的./node_modules/.bin中
在当前项目就可以利用以下命令执行那个npm包的执行文件(index.js)
package.json中scripts中添加create-release-it命令npm run create-release执行
{
"scripts":{
"create-release":"create-release-it"
}
}
npx create-release-itnode ./node_modules/.bin/create-release-it执行文件(index.js)。
- 示例
bin字段中的index.js
当前项目node_modules/.bin/create-release-it
执行 npx create-release-it时 就会执行该文件
- 全局/局部安装
- 全局安装,npm就会使用符号链接将这些文件链接到/usr/local/bin中
- 局部安装, 会链接到./node_modules/.bin中
#!/usr/bin/env node
使用node去解析这个脚本文件 ,同时解决不同的用户node路径不同的问题,
#!(Shebang) 这个符号通常在Unix系统中使用,指明这个脚本文件的解释程序
windows是不支持Shebang的,它是通过文件的扩展名来确定使用什么解释器执行这个脚本文件
usr/bin/env不同的用户或不同的解释器可能安装在不同的目录下。 指明系统在PATH目录下查找解释程序
create-release-it源码分析
看看执行npx release-it命令时到底做了什么事情
整体结构
1. 将release-it命令添加至scripts中
- 读取package.json文件
- 在scripts中增加命令
- 将文件更改写回到package.json
2. 用户交互选择配置文件
- 选择配置文件
- 根据不同的选择进行不同的处理
3. 安装release-it
6. npm run release
执行原理
经过上面的应该知道release-it这个命令的执行原理
”scripts“:{
"release": "release-it"
}
- 执行
npm run release-it其实就是去执行node_modules/.bin/release-it这个文件
- 查看release-it的package.json这个包的
bin字段,可以查看到对应可执行文件
- 查看这个
bin/release-it文件,可以看到和node_modules/.bin/release-it这个文件相同
总结和问题记录
总结
- commitizen能够让我们在提交规范的commit记录,能很快从commit message中确定修改变动的内容。
- release-it 命令可以通过相关配置对项目更新版本号、对应版本的TAG推送到Git仓库、 还可以增加对应的release版本。
- 通过初始化release-it的过程,学习npm init 和 npx 的相关联系,以及他们的执行原理
问题遗留
这些问题将会放在别的文章里面体现
- 关于版本号的详细内容和规范
- release-it源码实现细节
- 关于commitlint