npm发包版本管理工具:release-it 和 changeset

734 阅读3分钟

release-itchangeset对比

当然!下面是 release-itchangeset 的对比,以表格形式展示:

特性release-itchangeset
适用场景自动化发布(Git、npm)Monorepo 多包变更管理
版本管理自动推测版本号(基于 Conventional Commits)手动创建变更记录,控制版本更新
适合项目单个 package多个 package(Monorepo)
Changelog自动生成(基于 commit)根据 changeset变更手动管理
Git 提交自动创建 commit、tag,并推送需要手动 git commit变更记录
发布方式一键发布(Git + npm)version,再 publish
自动化程度🚀🚀🚀(全自动)🚀(手动控制变更,更精细)
适合团队适合单人开发或小团队适合多人协作,避免错误的版本推测

✅ 如何选择?

  • 单包项目release-it 🏆
  • Monorepo(多个 package)changeset 🏆
  • 希望自动化 Git + npm 发布release-it
  • 希望手动控制每次版本变更changeset

如果你的项目是 Monorepo + pnpm,推荐 Changesets!👍

release-it 使用

release-it 是一个强大的 自动化发布工具,可以完成 Git 提交 + 生成 tag + 生成 Changelog + npm 发布,适用于单个 package 的管理。


1️⃣ 安装

pnpm add release-it -D

或者使用 npx 直接运行(无需安装):

npx release-it

2️⃣ 快速开始

默认情况下,release-it 会:
✅ 询问你要发布的新版本(自动推测 semver
✅ 更新 package.json 版本号
✅ 生成 Git commit 并创建 tag
✅ 生成 CHANGELOG.md(基于 Conventional Commits)
推送 Git commit 和 tag
发布到 npm(如果启用了 npm publish

执行:

pnpm release-it

然后按照提示输入新版本号,它会自动完成所有操作。


3️⃣ 配置 release-it

可以创建 .release-it.json.release-it.js 来自定义行为:

示例:最小配置

📄 .release-it.json

{
  "git": {
    "tagName": "v${version}",
    "commitMessage": "chore(release): v${version}",
    "push": true
  },
  "npm": {
    "publish": true
  }
}

🔹 tagName: Git 标签格式,例如 v1.2.3
🔹 commitMessage: 版本提交信息
🔹 push: 是否自动推送 Git 变更
🔹 publish: 是否自动发布到 npm


4️⃣ 高级用法

🔹 4.1 指定发布版本

手动指定版本号:

pnpm release-it 1.2.3

使用 majorminorpatch

pnpm release-it minor

示例:

命令结果(假设当前版本 1.0.0
pnpm release-it major2.0.0
pnpm release-it minor1.1.0
pnpm release-it patch1.0.1

🔹 4.2 只执行部分任务

如果只想 创建 tag,不发布:

pnpm release-it --no-npm

如果只想 发布到 npm,不推送 Git:

pnpm release-it --no-git

🔹 4.3 使用 Hooks

可以在不同阶段执行额外的命令,比如运行测试: 📄 .release-it.json

{
  "hooks": {
    "before:init": "pnpm test",
    "before:git:release": "echo Releasing new version!"
  }
}

🔹 before:init: 运行测试
🔹 before:git:release: 版本发布前执行命令


🔹 4.4 自动生成 CHANGELOG

可以结合 conventional-changelog 自动生成:

pnpm add conventional-changelog -D

📄 .release-it.json

{
  "plugins": {
    "@release-it/conventional-changelog": {
      "preset": "angular"
    }
  }
}

然后执行:

pnpm release-it

它会自动分析 Git commit 并生成 CHANGELOG.md


5️⃣ 结合 CI/CD 自动化

GitHub Actions 中,可以用 release-it 自动发布:
📄 .github/workflows/release.yml

name: Release

on:
  push:
    branches:
      - main

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: pnpm/action-setup@v2
        with:
          version: latest
      - run: pnpm install
      - run: pnpm release-it
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

📌 注意:
🔹 需要在 GitHub Secrets 配置 GITHUB_TOKENNPM_TOKEN
🔹 当 main 分支有变更时,会自动发布新版本

changeset 使用

1️⃣ 安装 changesets

如果你还没有安装 changesets,可以在 monorepo 根目录执行:

pnpm add -D @changesets/cli

然后初始化:

npx changeset init

它会创建 .changeset 目录,并生成 config.json,默认情况下 changesets 只会更新有变更的 package。

2️⃣只更新某个 package

当你只想更新某个包(如 packages/foo),可以执行:

npx changeset

然后:

  1. 选择要更新的 package(比如 packages/foo)。
  2. 选择版本类型
    • patch(修订版,比如 1.0.0 → 1.0.1
    • minor(次版本,比如 1.0.0 → 1.1.0
    • major(主版本,比如 1.0.0 → 2.0.0

这会在 .changeset/ 目录下生成一个变更文件(如 random-id.md),里面记录了要更新的 package 和版本号。

3️⃣ 仅更新该 package 版本

执行:

npx changeset version

它只会更新 package.json 的版本号,并不会发布。

更新后的 package.json 示例:

{
  "name": "foo",
  "version": "1.0.1",
  "dependencies": {}
}

4️⃣只发布该 package

npx changeset publish
  • 默认情况下changeset publish 只会发布 版本号有变更的 package,其他 package 不会被影响。
  • 这一步相当于执行 pnpm publish,并自动处理 dependencies 的版本更新。