如何用.NET Core构建任务制作预发布包并实现分发包流程?
这问题我之前帮不少团队落地过,刚好完美匹配你的需求——同时生成预发布/正式两类包,自动推送预发布,正式包支持单独手动发布。咱们一步步来拆解:
1. 确认csproj版本配置(你当前的配置已经没问题)
你现有的csproj配置完全适配这个场景:
<VersionPrefix>1.8.0</VersionPrefix> <VersionSuffix>$(VersionSuffix)</VersionSuffix>
这个配置的核心是通过外部传入的VersionSuffix参数动态控制版本后缀——不传就是正式版,传入构建号就是预发布版。
2. CI构建阶段:生成两类包
在CI流程里,你需要执行两次dotnet pack命令,分别生成预发布包和正式包,并且把它们放到不同的输出目录,方便后续区分处理:
2.1 生成预发布包
用CI的构建号作为预发布后缀(比如GitHub Actions的GITHUB_RUN_NUMBER、Azure Pipelines的Build.BuildNumber),命令如下:
dotnet pack --configuration Release -p:VersionSuffix=ci-$(BUILD_NUMBER) --output ./packages/pre-release
生成的包版本会是1.8.0-ci-xxx(xxx是你的构建号),完全符合NuGet的预发布版本规范。
2.2 生成正式发布包
不传入VersionSuffix参数,直接打包即可:
dotnet pack --configuration Release --output ./packages/stable
生成的包版本就是你定义的1.8.0,是标准的正式版。
小提示:如果你的解决方案有多个csproj,
dotnet pack会默认打包所有项目,不用单独逐个执行,除非你有特殊排除需求。
3. 发布阶段:自动推预发布 + 手动单独发正式包
3.1 自动推送所有预发布包
构建完成后,直接在CI里自动执行推送命令,把pre-release目录下的所有包推送到NuGet源:
dotnet nuget push ./packages/pre-release/*.nupkg --source <你的NuGet源地址> --api-key <你的API密钥>
记得把<你的NuGet源地址>和<你的API密钥>换成实际值,并且API密钥要存在CI的机密变量里(比如GitHub Secrets、Azure Pipelines机密变量),绝对不能明文写在脚本里。
3.2 手动单独发布正式包
这一步需要在CI平台里配置手动触发的发布任务,让你可以选择单个正式包推送。举两个主流CI平台的实现思路:
比如GitHub Actions:
- 用
workflow_dispatch事件创建一个单独的发布工作流,添加一个输入参数让你选择要发布的项目(比如ProjectA、ProjectB)。 - 工作流里根据选择的项目,推送对应的正式包:
dotnet nuget push ./packages/stable/${{ inputs.project-name }}.1.8.0.nupkg --source <你的NuGet源地址> --api-key ${{ secrets.NUGET_API_KEY }}
这样你就能在GitHub Actions页面手动触发,选择要发布的项目单独推送。
比如Azure Pipelines:
- 在发布管道里创建多个“阶段”,每个阶段对应一个项目的正式包发布。
- 给每个阶段设置“手动审批”,只有你手动确认后才会执行推送命令。
- 每个阶段的推送命令类似:
dotnet nuget push ./packages/stable/ProjectA.1.8.0.nupkg --source <你的NuGet源地址> --api-key $(NuGetApiKey)
额外建议:如果你的版本号需要自动递增(比如下次正式版是1.9.0),可以把
VersionPrefix也改成通过CI参数传入,这样不用每次修改csproj文件,更灵活。
内容的提问来源于stack exchange,提问作者Martijn

