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

GitHub工作流使用Versionize发布NuGet遇多项目版本冲突求解

多项目NuGet包发布工作流调整方案

现存问题

  • 当前配置的GitHub工作流仅可正常发布Project1,无法完成src/Project2/Project2.csproj、src/Project3/Project3.csproj的NuGet包发布
  • 为每个项目单独创建内容完全一致的工作流时,会触发Versionize冲突:第一个项目发布成功后,剩余两个项目均因版本问题发布失败

原问题中的工作流配置如下:

name: Publish

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0
    - name: Setup .NET
      uses: actions/setup-dotnet@v2
      with:
        dotnet-version: 6.0.x
        source-url: https://nuget.pkg.github.com/Xnt/index.json
      env:
        NUGET_AUTH_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
    - name: Install dotnet tools
      run: dotnet tool install --global Versionize
    - name: Restore
      run: dotnet restore
    - name: Build
      run: dotnet build -c Release --no-restore
    - name: Setup git
      run: |
        git config --global user.name 'GitHub actions'
        git config --global user.email '...'
    - name: Version
      run: versionize
    - name: Push tags
      run: |
        git push --follow-tags
    - name: Pack
      run: dotnet pack --no-build -c Release -o . src/Project1/Project1.csproj
    - name: Publish
      run: dotnet nuget push *.nupkg

问题根因

  1. 原配置的Pack步骤仅指定了Project1的项目路径,不会打包另外两个项目,自然无法完成发布
  2. Versionize默认在仓库根目录执行,会基于全局提交生成统一格式的版本tag(默认前缀为v,比如v1.0.0),三个项目共用同一种tag命名规则,不管是在同一个工作流还是拆分到多个工作流,第一个项目生成并推送tag后,后续项目执行Versionize时会检测到对应版本tag已存在,直接抛出版本冲突错误。

调整后可正常运行的配置

核心修改点:

  • 针对每个项目单独执行Versionize,通过--workingDir参数指定项目目录,确保版本计算仅关联对应项目的提交记录
  • 为每个项目配置独立的tag前缀,避免不同项目的版本tag重名冲突
  • 修改Pack步骤,同时打包三个待发布的项目

完整配置代码:

name: Publish

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0
    - name: Setup .NET
      uses: actions/setup-dotnet@v2
      with:
        dotnet-version: 6.0.x
        source-url: https://nuget.pkg.github.com/Xnt/index.json
      env:
        NUGET_AUTH_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }}
    - name: Install dotnet tools
      run: dotnet tool install --global Versionize
    - name: Restore
      run: dotnet restore
    - name: Build
      run: dotnet build -c Release --no-restore
    - name: Setup git
      run: |
        git config --global user.name 'GitHub actions'
        git config --global user.email '...'
    # 每个项目单独执行版本计算,配置独立工作目录和tag前缀
    - name: Calculate version for Project1
      run: versionize --workingDir src/Project1 --tag-prefix project1-v
    - name: Calculate version for Project2
      run: versionize --workingDir src/Project2 --tag-prefix project2-v
    - name: Calculate version for Project3
      run: versionize --workingDir src/Project3 --tag-prefix project3-v
    - name: Push version tags
      run: |
        git push --follow-tags
    # 打包所有待发布项目
    - name: Pack all projects
      run: |
        dotnet pack --no-build -c Release -o . src/Project1/Project1.csproj
        dotnet pack --no-build -c Release -o . src/Project2/Project2.csproj
        dotnet pack --no-build -c Release -o . src/Project3/Project3.csproj
    - name: Publish packages to NuGet
      run: dotnet nuget push *.nupkg

额外说明

如果坚持要为每个项目拆分独立的工作流文件,每个工作流中执行Versionize时也必须加上对应项目的--workingDir参数和专属--tag-prefix参数,禁止直接全局执行versionize,否则依然会出现tag冲突问题。

内容的提问来源于stack exchange,提问作者nop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:48:08