无情的推动自动化
简版 2021 年
package.json 中通过钩子实现一行命令 npm version major / minor / patch
发布到 NPM。
"scripts": {
"test": "jest --coverage",
"build": "tsc --declaration"
+ "preversion": "npm test && npm run build",
+ "postversion": "npm publish && git push && git push --tags",
}
发布只需执行
npm version major/minor/patch
将自动在发布前完成测试和构建,如果失败则不会更新版本和发布。且发布后自动 push 代码和 tag 到远端 👍。
完善版 2025-5-23
{
"scripts": {
"========== Publishing ==========": "",
"pub:patch": "npm version patch",
"pub:minor": "npm version minor",
"pub:major": "npm version major",
"preversion": "nvm use 22 && git pull && git push origin HEAD && pnpm i && npm run build",
"postversion": "npm publish && git push origin HEAD && git push --tags",
"prebuild": "concurrently -n 🧪,🔍 -p name \"npm run test:cov\" \"npm run lint\"",
"publishd": "npm publish --dry-run",
}
}
发布命令
bun pub:major/pub:minor/pub:patch
将在发布前:
- 自动切换到指定 node.js 版本。
- 拉取最新代码并 push 到远端。确保 Git 状态清洁。
- 安装最新依赖:防止他人代码修改发布用了老代码或者老依赖,。
- 执行测试和 lint(性能考虑二者并行)以及构建:如果失败则不会执行无谓的构建和更新 tag 版本以及发布。
- 发布后自动 push 代码和 tag 到远端。
- publishd:模拟发布过程将输出即将发布的文件。确认发布文件都已完备。
后记
当然推荐使用流水线发布,但如果本地要发布的话,要保障“安全性”,需要执行单测、拉取最新代码重装依赖等,尽量模拟 CI 发布。
1. 可以有一个改善,通过 publishd 检查前后两次发布删除以及新增的文件,如果删除或新增文件超过某个阈值则提醒发布者是否继续发布。“血淋淋”的发布问题,某次修改了 files 或者 .gitignore 少发布了大量文件,导致引用了最新版本的项目出现了问题。这里没有实现该功能,大家可以探究下。
2. np Sindre Sorhus 写的一个优 npm publish
替代工具,提供交互式界面、自动运行测试、确保 Git 状态清洁等功能。 因为我不想为了发布而额外安装一个包,本文的标题是“0 依赖”。若大家感兴趣也可尝试下。