如何使用release-please为monorepo组件创建主次版本标签?
Monorepo组件浮动主/次版本标签管理方案
你在管理一个多组件monorepo,目录结构如下:
packages/ package1/ package2/
目前通过include_component_in_tag配置为每个包生成了package1-v2.1.1这类精确版本标签,但需要额外生成package1-v2(主版本浮动标签)、package2-v3.2(主次版本浮动标签),让消费者能通过这些标签自动获取对应分支的最新bug修复版本。以下是针对monorepo组件的可行实现方案:
方案1:基于semantic-release自定义标签更新逻辑
如果用semantic-release管理版本,可通过自定义插件脚本在发布后生成/更新浮动标签:
- 修改semantic-release配置文件(比如
.releaserc.json),添加自定义脚本到plugins列表:
{ "branches": ["main"], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", ["@semantic-release/npm", { "npmPublish": true, "pkgRoot": "packages/${package.name}" }], ["@semantic-release/git", { "assets": ["packages/*/package.json"], "message": "chore(release): publish ${nextRelease.version} for ${package.name}\n\n${nextRelease.notes}" }], ["./scripts/update-floating-tags.js"] ], "preset": "angular", "monorepo": { "includeComponentInTag": true } }
- 编写
scripts/update-floating-tags.js脚本,实现浮动标签的生成与更新:
const { execSync } = require('child_process'); module.exports = async (_, context) => { const { packageName, nextRelease } = context; const [major, minor] = nextRelease.version.split('.'); // 定义要生成的浮动标签 const tags = [ `${packageName}-v${major}`, // 主版本标签 `${packageName}-v${major}.${minor}` // 主次版本标签 ]; tags.forEach(tag => { // 删除本地和远程的旧标签(避免冲突) try { execSync(`git tag -d ${tag}`); } catch {} try { execSync(`git push origin :refs/tags/${tag}`); } catch {} // 创建新标签并推送 execSync(`git tag -a ${tag} -m "Floating tag for ${packageName} ${tag.split('-v')[1]}"`); execSync(`git push origin ${tag}`); }); };
这个脚本会在每个组件发布成功后,自动生成并推送对应的浮动标签,旧标签会被覆盖,确保标签始终指向该版本分支的最新版本。
方案2:CI流水线中添加标签更新步骤
如果不用semantic-release,可在CI流水线(比如GitHub Actions、GitLab CI)中直接添加步骤处理浮动标签:
以GitHub Actions为例,在组件发布完成后添加以下步骤:
- name: Update floating tags for component env: PACKAGE_NAME: ${{ matrix.package }} # 假设用矩阵遍历所有组件 run: | # 读取组件的最新版本 NEW_VERSION=$(jq -r '.version' packages/${PACKAGE_NAME}/package.json) MAJOR=$(echo $NEW_VERSION | cut -d '.' -f 1) MINOR=$(echo $NEW_VERSION | cut -d '.' -f 1-2) # 更新主版本标签 MAJOR_TAG="${PACKAGE_NAME}-v${MAJOR}" git tag -d $MAJOR_TAG || true git push origin :refs/tags/$MAJOR_TAG || true git tag -a $MAJOR_TAG -m "Floating major tag for ${PACKAGE_NAME} v${MAJOR}" git push origin $MAJOR_TAG # 更新主次版本标签 MINOR_TAG="${PACKAGE_NAME}-v${MINOR}" git tag -d $MINOR_TAG || true git push origin :refs/tags/$MINOR_TAG || true git tag -a $MINOR_TAG -m "Floating minor tag for ${PACKAGE_NAME} v${MINOR}" git push origin $MINOR_TAG
关键注意事项
- 确保CI流水线拥有仓库的Git读写权限(比如配置仓库令牌)
- 浮动标签是“移动指针”逻辑,每次新版本发布都会覆盖旧标签,消费者拉取时会自动获取最新版本
- 若需要版本回滚,需额外处理浮动标签的回滚操作,避免标签指向错误版本
内容的提问来源于stack exchange,提问作者wonton
相关产品推荐
相关产品推荐

