利用release-it发布npm包

877 阅读5分钟

前提

过程记录

  1. 创建远程registry,选择License:MIT

  1. 安装
yarn add release-it -D
  1. 添加脚本

  1. 运行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"
  }
 }
}
  1. 安装changlog插件---规范生成change-log
npm i @release-it/conventional-changelog -D
npm i -D git-cz
  1. 运行

学习

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

commitizen的适配器

使用
  1. 全局安装独立使用
npm i -D git-cz //安装
git-cz //执行
  1. 和Commitizen一起使用
npm install -g commitizen //安装commitizen

package.json配置

{
  "config": {
    "commitizen": {
      //新增commitizen配置
      "path": "git-cz"
    }
  }
}
  • 使用方式
npx git-cz
// 如果配合commitizen 
npx git cz 或者 npx cz就可以了
  • 效果
  1. 确定commit的类型

  1. 对改动进行简短的一个描述

  1. 对改动进行长的描述

  1. 列出破坏性的改变

  1. 使用该commit信息 关闭某条issue

cz-git

使用都大差不差,看配置就行了

2. release-it

基本介绍
  • 作用 控制 包版本管理和发布
  • 功能

使用
安装配置
  • npm init release-it

一般release-it会生成默认的配置,如果需要重新配置的话,将在以下这两个地方进行配置

  1. 选择 .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
 },
}
  1. 或者选择在package.json中配置
{
  "name": "my-package",
  "devDependencies": {
    "release-it": "*"
  },
  "release-it": {
    "github": {
      "release": true
    }
  }
}
踩坑记录
  1. release-it有功能为在npm上发布包, 因此需要确定登录npm,否则会出现报错,跟着指令进行npm login。

  1. release执行时,本地需要没有更改文件,否则会报错

  1. 想要发布的包在npm中已经存在, 并且配置该option就可能会报错
"npm": {
    "publish": true
  },

  1. 本地分支名称和远程分支名称不匹配(需要建立关联--set-upstream)

执行结果
  • 执行选择

  1. 选择发布的版本

关于版本号 ‘0.0.1’对应 major,minor,patch

后续会自动识别版本号,就不会出现该选项了,增加相应的配置就可以重新选择

  "plugins": {
    "@release-it/conventional-changelog": {
      "preset": "angular",
      "header": "# Changelog",
      "infile": "CHANGELOG.md",
      //增加配置
        "ignoreRecommendedBump": "true"
    }
  }
  1. 需要将package.json中修改version字段的 改动提交到git

  1. 打tag

  1. 是否将更改的内容push到远程git

  1. 是否发布到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. 发布

  1. 可以自己手动发布npm publish 目前最新的一个版本

  • 报错 :该包名已经存在,更新包名后重新执行run release

  1. 通过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)

  1. package.json中scripts中添加create-release-it命令 npm run create-release执行
{
  "scripts":{
    "create-release":"create-release-it"
  }
}
  1. npx create-release-it
  2. node ./node_modules/.bin/create-release-it 执行文件(index.js)。
  • 示例

bin字段中的index.js

当前项目node_modules/.bin/create-release-it

执行 npx create-release-it时 就会执行该文件

  • 全局/局部安装
  1. 全局安装,npm就会使用符号链接将这些文件链接到/usr/local/bin中
  2. 局部安装, 会链接到./node_modules/.bin中
  • #!/usr/bin/env node

使用node去解析这个脚本文件 ,同时解决不同的用户node路径不同的问题,

  1. #! (Shebang) 这个符号通常在Unix系统中使用,指明这个脚本文件的解释程序

windows是不支持Shebang的,它是通过文件的扩展名来确定使用什么解释器执行这个脚本文件

  1. usr/bin/env不同的用户或不同的解释器可能安装在不同的目录下。 指明系统在PATH目录下查找解释程序
create-release-it源码分析

看看执行npx release-it命令时到底做了什么事情

整体结构

1. 将release-it命令添加至scripts中
  1. 读取package.json文件

  1. 在scripts中增加命令

  1. 将文件更改写回到package.json

2. 用户交互选择配置文件
  1. 选择配置文件

  1. 根据不同的选择进行不同的处理

3. 安装release-it

6. npm run release

执行原理

经过上面的应该知道release-it这个命令的执行原理

”scripts“:{
  "release": "release-it"
}
  1. 执行npm run release-it 其实就是去执行node_modules/.bin/release-it这个文件

  1. 查看release-it的package.json这个包的bin字段,可以查看到对应可执行文件

  1. 查看这个bin/release-it文件,可以看到和node_modules/.bin/release-it这个文件相同

总结和问题记录

总结

  1. commitizen能够让我们在提交规范的commit记录,能很快从commit message中确定修改变动的内容。
  2. release-it 命令可以通过相关配置对项目更新版本号、对应版本的TAG推送到Git仓库、 还可以增加对应的release版本。
  3. 通过初始化release-it的过程,学习npm init 和 npx 的相关联系,以及他们的执行原理

问题遗留

这些问题将会放在别的文章里面体现

  1. 关于版本号的详细内容和规范
  2. release-it源码实现细节
  3. 关于commitlint