
本文介绍如何在 package.json 的 npm script 中自动读取并递增 version 字段,生成如 "chore: release 0.1.3" 的提交信息,避免手动修改,实现语义化版本自动化发布。
本文介绍如何在 package.json 的 npm script 中自动读取并递增 version 字段,生成如 "chore: release 0.1.3" 的提交信息,避免手动修改,实现语义化版本自动化发布。
在 Node.js 项目中,直接在 package.json 的 scripts 字段中使用 JavaScript 表达式(如 ${version} 或 process.env.npm_package_version)是不可行的——npm script 本质是 shell 命令执行环境,不支持原生 JS 模板解析。但可通过组合 CLI 工具与 shell 脚本实现「读取当前版本 → 语义化递增 → 注入 commit message」的完整自动化流程。
✅ 推荐方案:semver + 自定义 Shell 脚本
首先全局安装 semver(轻量、标准、专为语义化版本设计):
npm install -g semver
接着创建可执行脚本 release.sh(推荐置于项目根目录):
#!/bin/bash
# 从 package.json 安全提取 version 字符串(兼容带空格/注释的格式)
current_version=$(node -p "require('./package.json').version")
# 使用 semver bump patch 实现 0.1.2 → 0.1.3(也可用 minor/major)
new_version=$(semver bump patch "$current_version")
# 执行空提交,消息含动态版本号
git commit --allow-empty -m "chore: release $new_version"
echo "✅ Released version: $new_version"
? 为什么用 node -p 替代 grep?
grep 解析 JSON 易受格式干扰(如换行、空格、注释),而 node -p 直接执行 JS,精准可靠,且无需额外依赖。
赋予执行权限并更新 package.json:
chmod +x release.sh
{
"version": "0.1.2",
"scripts": {
"release": "./release.sh"
}
}
运行 npm run release 即可完成自动递增与提交。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
⚠️ 注意事项与增强建议
-
版本写回 package.json? 当前脚本仅读取版本用于 commit。若需同步更新 package.json 中的 version 字段,可在脚本末尾添加:
npm version patch --no-git-tag-version
此命令会更新 package.json 并跳过 Git tag,保持流程纯净。
跨平台兼容性:上述脚本适用于 macOS/Linux。Windows 用户可改用 PowerShell 脚本,或借助 cross-env + npm-run-all 构建多平台方案;更简单的方式是直接使用 npx semver 避免全局安装。
安全提示:确保 package.json 版本字段格式合法(如 1.2.3),semver 对非法格式会报错,可添加校验逻辑提升健壮性。
通过该方案,你获得了一个轻量、可维护、符合 SemVer 规范的自动化发布入口,真正实现“一次配置,持续复用”。










