如何在npm publish前验证版本号有效性?含CircleCI分支PR校验场景
如何在CircleCI的PR阶段验证npm包版本号更新(不提前发布)
完全可以实现这个需求!针对你用CircleCI做构建,想要在PR到master分支时验证版本号已更新、但又不想在合并前发布包的场景,我给你两个实用的解决方案,结合CircleCI的配置就能轻松搞定:
方案1:对比本地版本与npm仓库最新版本
这个方案适合已经发布过包的场景,通过拉取npm仓库里的最新版本,和当前PR分支的版本号做对比:
步骤1:编写版本验证脚本
在项目根目录创建scripts/validate-version.sh脚本,内容如下:
#!/bin/bash set -e # 获取当前package.json中的版本号 CURRENT_VERSION=$(jq -r '.version' package.json) # 获取npm仓库中该包的最新版本号(替换成你的包名) LATEST_VERSION=$(npm view your-package-name version) if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then echo "❌ 错误:版本号未更新!当前版本($CURRENT_VERSION)与npm仓库最新版本($LATEST_VERSION)一致。" exit 1 else echo "✅ 版本验证通过:当前版本($CURRENT_VERSION)与npm仓库最新版本($LATEST_VERSION)不同。" fi
记得给脚本添加执行权限:chmod +x scripts/validate-version.sh
步骤2:配置CircleCI工作流
在.circleci/config.yml中添加验证job,并设置只在PR触发时运行,发布job只在master分支合并后运行:
version: 2.1 jobs: validate-version: docker: - image: cimg/node:20 steps: - checkout - run: npm install -g jq # 安装jq用于解析JSON(若镜像已自带可省略) - run: ./scripts/validate-version.sh publish-package: docker: - image: cimg/node:20 steps: - checkout - run: npm install - run: npm publish # 发布前确保CircleCI已配置NPM_TOKEN环境变量 workflows: version-check-and-publish: jobs: - validate-version: filters: branches: only: /pull\/.*$/ # 仅对PR触发的构建执行验证 - publish-package: filters: branches: only: master # 仅在master分支合并后执行发布
方案2:对比PR分支与master分支的版本号
如果你的包还未发布,或者不想依赖npm仓库,可以直接对比当前PR分支和master分支的package.json版本号:
步骤1:编写分支版本对比脚本
创建scripts/validate-version-against-master.sh脚本:
#!/bin/bash set -e # 获取当前分支的版本号 CURRENT_VERSION=$(jq -r '.version' package.json) # 获取master分支的package.json版本号 MASTER_VERSION=$(git show master:package.json | jq -r '.version') if [ "$CURRENT_VERSION" = "$MASTER_VERSION" ]; then echo "❌ 错误:版本号未更新!当前版本($CURRENT_VERSION)与master分支版本($MASTER_VERSION)一致。" exit 1 else echo "✅ 版本验证通过:当前版本($CURRENT_VERSION)与master分支版本($MASTER_VERSION)不同。" fi
步骤2:更新CircleCI配置
把方案1中的validate-versionjob替换成调用这个脚本即可,其余配置保持一致。
注意事项
- 如果是私有npm包,需要在CircleCI的项目环境变量中配置
NPM_TOKEN,确保能拉取仓库版本或发布包。 - 若使用monorepo结构,需要调整脚本中的
package.json路径(比如packages/your-package/package.json)。 - 可以根据需求扩展脚本,比如验证版本号是否符合语义化版本规范(semver)。
内容的提问来源于stack exchange,提问作者trentjones21
相关产品推荐
相关产品推荐

