使用 Azure Pipelines 发布 NuGet 包(YAML/经典)
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018
在 Azure Pipelines 中,可以使用经典编辑器或 YAML 任务将管道中的 NuGet 包发布到 Azure Artifacts 源或公共注册表,例如 nuget.org。
创建 NuGet 包
有多种方法可以创建 NuGet 包,例如使用 Visual Studio 打包 NuGet 包。 如果已使用 MSBuild 或其他一些任务创建包,请跳过此部分并跳转到 “发布包 ”部分。
若要创建 NuGet 包,请将以下代码片段添加到管道 YAML 文件。 有关详细信息,请参阅 NuGet 任务 。
- task: NuGetCommand@2
inputs:
command: pack
packagesToPack: '**/*.csproj'
packDestination: '$(Build.ArtifactStagingDirectory)'
- packagesToPack:搜索要打包的 csproj 目录的模式
- packDestination:将在其中创建包的目录
TFS 不支持 YAML。
包版本控制
NuGet 包的名称和版本号标识。 建议使用语义版本控制对包进行版本控制。 语义版本有三个数值组件: 主要、 次要和 修补程序。
修复 bug 后,修补程序通常会递增, (例如 1.0.0 ->1.0.1) 。 发布新的后向兼容功能时,将次要版本递增,并将修补程序版本重置为 0 (,例如 1.4.17 ->1.5.0) 。 进行向后不兼容更改时,将主版本递增,并将次要版本和修补程序版本重置为 0 (,例如 2.6.5 ->3.0.0) 。
使用语义版本控制,还可以使用预发行版标签标记包。 若要使用预发行标签,请输入一个连字符,后跟你选择的任何字母 () 或数字 (s) :例如 1.0.0-beta。
Azure Pipelines 支持语义版本控制,可以在 NuGet 任务中配置:
对生成和包使用相同的版本控制方案:
$(Major).$(Minor).$(rev:.r),其中Major和Minor管道中定义了两个变量。 此格式将自动递增内部版本号和具有新修补程序号的包版本。 它将保持主版本和次要版本不变,直到手动更改它们。$(Major).$(Minor).$(Patch).$(date:yyyyMMdd),其中Major,Minor以及Patch管道中定义的变量。 此格式将为生成和包创建新的预发行版标签,同时保持主版本、次要版本和修补程序版本不变。
使用自定义版本控制方案。 可以为包自定义主要版本、次要版本和修补程序版本,并让 NuGet 任务基于日期和时间生成唯一的预发行版标签。
使用生成管道中的脚本生成版本。
此示例演示如何使用日期和时间作为预发行标签。
variables:
Major: '1'
Minor: '0'
Patch: '0'
steps:
- task: NuGetCommand@2
inputs:
command: pack
versioningScheme: byPrereleaseNumber
majorVersion: '$(Major)'
minorVersion: '$(Minor)'
patchVersion: '$(Patch)'
TFS 不支持 YAML。
注意
DotNetCore 和 DotNetStandard 包应与任务一起 DotNetCoreCLI@2 打包,以避免 System.InvalidCastExceptions。 有关更多详细信息,请参阅 .NET Core CLI 任务 。
task: DotNetCoreCLI@2
inputs:
command: pack
versioningScheme: byPrereleaseNumber
majorVersion: '$(Major)'
minorVersion: '$(Minor)'
patchVersion: '$(Patch)'
发布包
若要从管道将包发布到 Azure Artifacts 源,必须将 Project Collection Build Service 标识设置为源上的 参与者 。 有关更多详细信息 ,请参阅“配置源设置 ”。
steps:
- task: NuGetAuthenticate@0
displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
displayName: 'NuGet push'
inputs:
command: push
publishVstsFeed: '<projectName>/<feed>'
allowPackageConflicts: true
若要将包发布到外部 NuGet 源,必须先创建服务连接以连接到该源。 可以通过转到 “项目设置>服务连接>”新建服务连接来执行此操作。 选择 NuGet,然后选择“ 下一步”。 填写表单,然后在完成后选择“ 保存 ”。 有关详细信息,请参阅 管理服务连接 。
若要将包发布到外部 NuGet 源,请将以下代码片段添加到 YAML 管道。
- task: NuGetAuthenticate@0
inputs:
nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>
- task: NuGetCommand@2
inputs:
command: push
nuGetFeedType: external
versioningScheme: byEnvVar
versionEnvVar: <VERSION_ENVIRONMENT_VARIABLE>
使用命令行任务 (NuGet.exe) 的示例:
- task: NuGetAuthenticate@1
inputs:
nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>
- script: |
nuget push <PACKAGE_PATH> -src https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json -ApiKey <ANY_STRING>
displayName: "Push"
使用命令行任务 (dotnet) 的示例:
- task: NuGetAuthenticate@1
inputs:
nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>
- script: |
dotnet build <CSPROJ_PATH> --configuration <CONFIGURATION>
dotnet pack <CSPROJ_PATH> -p:PackageVersion=<YOUR_PACKAGE_VERSION> --output <OUTPUT_DIRECTORY> --configuration <CONFIGURATION>
dotnet nuget push <PACKAGE_PATH> --source https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json --api-key <ANY_STRING>
displayName: "Build, pack and push"
注意
仅 ApiKey 用作占位符。
TFS 不支持 YAML。


