
本文介绍如何在 package.json 的 npm script 中自动读取当前 version 字段、按语义化规则(如 patch)递增,并将其注入 git 提交信息,实现无需手动修改即可生成如 "chore: release 0.1.3" 的自动化发布流程。
本文介绍如何在 package.json 的 npm script 中自动读取当前 version 字段、按语义化规则(如 patch)递增,并将其注入 git 提交信息,实现无需手动修改即可生成如 "chore: release 0.1.3" 的自动化发布流程。
在现代前端/Node.js 工程中,频繁手动更新 package.json 中的 version 并同步修改 commit message 不仅低效,还易出错。理想方案是:从 package.json 动态读取当前版本 → 按需递增(如 patch)→ 将新版本号注入 Git 提交消息。由于 package.json 的 scripts 字段本身不支持 JavaScript 表达式或变量插值,必须借助外部工具链完成该逻辑。
✅ 推荐方案:使用 semver + Shell 脚本
首先全局安装 semver CLI 工具(用于安全、标准的语义化版本操作):
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':semver bump minor $current_version
new_version=$(semver bump patch "$current_version")
# 执行带空消息的提交(--allow-empty 允许空变更),消息中嵌入新版本
git commit --allow-empty -m "chore: release $new_version"
echo "✅ Released version: $new_version"
? 为什么用 node -p 而非 grep?
grep 解析 JSON 易受格式干扰(如缩进、注释、字段顺序),而 node -p 直接执行 JS,精准可靠,且无需额外依赖。
赋予脚本执行权限:
chmod +x release.sh
最后,在 package.json 中将 release 脚本指向该脚本:
{
"version": "0.1.2",
"scripts": {
"release": "./release.sh"
}
}
运行 npm run release 即可自动完成全部流程。
⚠️ 注意事项与增强建议
-
版本校验:可在脚本开头添加校验,防止非法 version 格式:
if ! semver valid "$current_version" > /dev/null; then echo "❌ Invalid version in package.json: $current_version" >&2 exit 1 fi
-
自动更新 package.json:若还需同步写回新版本(如配合 npm version patch),可追加:
npm version "$new_version" --no-git-tag-version
(注意:npm version 会触发 preversion/postversion 钩子,按需启用)
跨平台兼容性:Windows 用户建议使用 Git Bash 或迁移至 Node.js 脚本(.js 文件 + node ./release.js),避免 shell 语法差异。
CI/CD 集成:该脚本可无缝集成到 GitHub Actions、GitLab CI 等流程中,作为发布前检查步骤。
通过以上方式,你彻底摆脱了硬编码版本号的束缚,让 package.json 的 scripts 具备“动态表达能力”,兼顾简洁性、健壮性与工程最佳实践。











