You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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管理版本,可通过自定义插件脚本在发布后生成/更新浮动标签:

  1. 修改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
  }
}
  1. 编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:03:09