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
问题根因
- 原配置的Pack步骤仅指定了
Project1的项目路径,不会打包另外两个项目,自然无法完成发布 - 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
相关产品推荐
相关产品推荐

