.NET Core CLI 任务

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017

注意

NuGet 身份验证任务是使用 Azure Artifacts 和其他 NuGet 存储库进行身份验证的新建议方法。 此任务的还原和推送命令不再采用新功能,并且仅解决了关键错误。

Azure Pipelines

使用此任务可生成、测试、打包或发布 dotnet 应用程序,或运行自定义 dotnet 命令。 对于包命令,此任务支持 NuGet 和身份验证源,如包管理和 MyGet。

如果 .net Core 或 .NET Standard 生成依赖于 NuGet 包,请确保添加此步骤的两个副本:一个包含 restore 命令,一个用于 build 命令。

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

YAML 代码段

# .NET Core
# Build, test, package, or publish a dotnet application, or run a custom dotnet command
- task: DotNetCoreCLI@2
  inputs:
    #command: 'build' # Options: build, push, pack, publish, restore, run, test, custom
    #publishWebProjects: true # Required when command == Publish
    #projects: # Optional
    #custom: # Required when command == Custom
    #arguments: # Optional
    #publishTestResults: true # Optional
    #testRunTitle: # Optional
    #zipAfterPublish: true # Optional
    #modifyOutputPath: true # Optional
    #feedsToUse: 'select' # Options: select, config
    #vstsFeed: # Required when feedsToUse == Select
    #feedRestore: # Required when command == restore. projectName/feedName for project-scoped feed. FeedName only for organization-scoped feed.
    #includeNuGetOrg: true # Required when feedsToUse == Select
    #nugetConfigPath: # Required when feedsToUse == Config
    #externalFeedCredentials: # Optional
    #noCache: false
    restoreDirectory:
    #restoreArguments: # Optional
    #verbosityRestore: 'Detailed' # Options: -, quiet, minimal, normal, detailed, diagnostic
    #packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg' # Required when command == Push
    #nuGetFeedType: 'internal' # Required when command == Push# Options: internal, external
    #publishVstsFeed: # Required when command == Push && NuGetFeedType == Internal
    #publishPackageMetadata: true # Optional
    #publishFeedCredentials: # Required when command == Push && NuGetFeedType == External
    #packagesToPack: '**/*.csproj' # Required when command == Pack
    #packDirectory: '$(Build.ArtifactStagingDirectory)' # Optional
    #nobuild: false # Optional
    #includesymbols: false # Optional
    #includesource: false # Optional
    #versioningScheme: 'off' # Options: off, byPrereleaseNumber, byEnvVar, byBuildNumber
    #versionEnvVar: # Required when versioningScheme == byEnvVar
    #majorVersion: '1' # Required when versioningScheme == ByPrereleaseNumber
    #minorVersion: '0' # Required when versioningScheme == ByPrereleaseNumber
    #patchVersion: '0' # Required when versioningScheme == ByPrereleaseNumber
    #buildProperties: # Optional
    #verbosityPack: 'Detailed' # Options: -, quiet, minimal, normal, detailed, diagnostic
    workingDirectory:

自变量

任务控制选项

参数说明
command
命令
要运行的 dotnet 命令。 选择 custom 以添加参数或使用此处未列出的命令。
选项: buildpushpackpublishrestoreruntestcustom
selectOrConfig
要使用的源
你可以选择从 Azure Artifacts 和/或 NuGet 中选择源,或将 NuGet.config 文件提交到源代码存储库,并使用参数设置其路径 nugetConfigPath
选项: selectconfig
参数别名: feedsToUse
versioningScheme
自动包版本控制
不能与 include 引用项目一起使用。 如果你选择 "使用日期和时间",则将生成一个 SemVer兼容版本,格式为 你选择 X、Y 和 Z。

如果选择 "使用环境变量",则必须选择一个环境变量并确保它包含要使用的版本号。

如果选择 "使用生成号",则会使用生成号对包进行版本。 注意: 在 "选项" 下,将 "生成号格式" 设置为 "$ (BuildDefinitionName) _ $ (Year: yyyy) 。 $ (Month) . $ (DayOfMonth) $ (Rev:. r) "
选项: offbyPrereleaseNumberbyEnvVarbyBuildNumber

arguments
自变量
所选命令的参数。 例如,生成配置、输出文件夹、运行时。 参数取决于所选的命令
注意:此输入当前只接受、、 buildpublishrun 、、的 test 参数 custom 。 如果要添加未列出的命令的参数,请使用 custom
projects
项目 (的路径)
要使用) (的 .csproj 文件的路径。 你可以使用通配符 (例如 **/*.csproj ,对于所有子文件夹中的所有 .csproj 文件) ,请参阅 **/*.csproj
noCache
禁用本地缓存
阻止 NuGet 使用本地计算机缓存中的包。
restoreArguments
还原参数
编写要传递到命令的其他参数 restore
packagesDirectory
目标目录
指定在其中安装包的文件夹。 如果未指定文件夹,包将还原为默认 NuGet 包缓存
参数别名: restoreDirectory
buildProperties
其他生成属性
指定对的列表 token = value (用分号分隔),nuspec 文件中的每个 $token $ 匹配项都将替换为给定的值。 值可以是用引号引起来的字符串
verbosityPack
详细程度
指定在命令的输出中显示的详细信息量 pack
verbosityRestore
详细程度
指定在命令的输出中显示的详细信息量 restore
workingDirectory
工作目录
运行脚本的当前工作目录。 空是存储库的根 (生成) 或项目 (版本) ,即 $ (System.defaultworkingdirectory)
searchPatternPush
要发布的 NuGet 包 (的路径)
要匹配的模式或要上传的 nupkg 文件的路径。 可以用分号分隔多个模式,并且可以通过在其前面加上前缀来使模式为负数 ! 。 示例:
参数别名: packagesToPush
nuGetFeedType
目标源位置
指定目标源是内部的还是外部的。
选项: internalexternal
feedPublish
目标源
选择托管在组织中的源。 您必须安装包管理并获得许可,才能在此处选择源
参数别名: publishVstsFeed
publishPackageMetadata
发布管道元数据
将此生成/发布管道 ’ 的元数据 (运行 ID、源代码信息与包) 相关联
externalEndpoint
NuGet 服务器
NuGet服务连接,其中包含外部 NuGet 服务器 凭据。
参数别名: publishFeedCredentials
searchPatternPack
要打包) (的 .csproj 或 nuspec 文件的路径
用于搜索要打包的 .csproj 或 nuspec 文件的模式。 可以用分号分隔多个模式,并且可以通过在其前面加上前缀来使模式为负数 ! 。 示例:
参数别名: packagesToPack
configurationToPack
包的配置
使用 .csproj 文件时,将指定要打包的配置。
参数别名: configuration
outputDir
包文件夹
将在其中创建包的文件夹。 如果为空,则将在 .csproj 文件旁创建包。
参数别名: packDirectory
nobuild
不生成
打包前不生成项目。 对应于 --no-build "build" 命令的参数。
includesymbols
包含符号
此外,还会创建符号 NuGet 包。 对应于 --include-symbols 命令行参数。
includesource
包含源
包含包中的源代码。 对应于 --include-source 命令行参数。
publishWebProjects
发布 Web 项目
如果 true 为,则 projects 将跳过属性值,并且该任务将尝试查找存储库中的 web 项目,并对其运行 "发布" 命令。 Web 项目通过目录中是否存在web.config wwwroot 文件夹进行标识。 如果没有文件或 wwwroot web.config,则选择使用 Web SDK 的项目(如 Microsoft .NET.Sdk.Web)。 请注意,如果未指定,此 true 参数默认为 。
zipAfterPublish
Zip 已发布项目
如果 true 为 ,则压缩并删除由 publish 命令创建的文件夹。
modifyOutputPath
添加项目名称以发布路径
如果为 ,则当在参数中显式指定输出路径时,由 publish 命令创建的文件夹将具有以文件夹名称为前缀 true 的项目文件名。 如果要将多个项目发布到同一文件夹,这很有用。
publishTestResults
发布测试结果
启用此选项将在 中生成测试结果 TRX 文件 $(Agent.TempDirectory) ,结果将发布到服务器。
此选项追加 --logger trx --results-directory $(Agent.TempDirectory) 到命令行参数。
可以通过将 添加到命令行参数 --collect "Code coverage" 来收集代码覆盖率。 这目前仅在 Windows 平台上可用。
testRunTitle
测试运行标题
提供测试运行的名称
custom
自定义命令
要传递给执行dotnet.exe的命令。
有关可用命令的完整列表,请参阅 dotnet CLI 文档
feedRestore
使用此源/TFS Azure Artifacts包
在生成的源中包括所选源NuGet.config。必须已安装包管理并已获得许可,在此处选择源。 项目范围的源的 projectName/feedName。 FeedName 仅适用于组织范围的源。 请注意,测试命令不支持此操作。
参数别名: vstsFeed
includeNuGetOrg
使用 NuGet.org 中的包
在生成的 NuGet.config000 0 中包括 NuGet.org。
nugetConfigPath
路径NuGet.config
存储库中NuGet.config指定要还原包的源。
externalEndpoints
此组织/集合外部源的凭据
用于位于所选注册表中的外部注册表的NuGet.config。对于此组织/集合中的源,请留空;自动 ’ 使用生成凭据
参数别名: externalFeedCredentials
versionEnvVar
环境变量
输入不带 $、$env 或 % 的变量名称
requestedMajorVersion
主要
版本X.Y.Z 中的"X"。
参数别名: majorVersion
requestedMinorVersion
次要
版本X.Y.Z 中的"Y"。
参数别名: minorVersion
requestedPatchVersion
修补程序
版本X.Y.Z 中的"Z"。
参数别名: patchVersion

示例

构建

生成项目

# Build project
- task: DotNetCoreCLI@2
  inputs:
    command: 'build'

生成多个项目

# Build multiple projects
- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: |
      src/proj1/proj1.csproj 
      src/proj2/proj2.csproj 
      src/other/other.sln    # Pass a solution instead of a csproj.

推送

将NuGet包推送到内部源

# Push non test NuGet packages from a build to internal organization Feed
- task: DotNetCoreCLI@2
  inputs:
    command: 'push'
    searchPatternPush: '$(Build.ArtifactStagingDirectory)/*.nupkg;!$(Build.ArtifactStagingDirectory)/*.Tests.nupkg'
    feedPublish: 'FabrikamFeed'

将NuGet包推送到外部源

# Push all NuGet packages from a build to external Feed
- task: DotNetCoreCLI@2
  inputs:
    command: 'push'
    nugetFeedType: 'external'
    externalEndPoint: 'MyNuGetServiceConnection'

Pack

将 NuGetPackage 打包到特定输出目录

# Pack a NuGet package to a test directory
- task: DotNetCoreCLI@2
  inputs: 
    command: 'pack'
    outputDir: '$(Build.ArtifactStagingDirectory)/TestDir'

打包符号包

# Pack a symbol package along with NuGet package
- task: DotNetCoreCLI@2
  inputs: 
    command: 'pack'
    includesymbols: true

发布

将项目发布到指定文件夹

# Publish projects to specified folder.
- task: DotNetCoreCLI@2
  displayName: 'dotnet publish'
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/*.csproj'
    arguments: '-o $(Build.ArtifactStagingDirectory)/Output'
    zipAfterPublish: true
    modifyOutputPath: true

还原

#Restore packages with the .NET Core CLI task
- task: DotNetCoreCLI@2
  displayName: 'dotnet restore'
  inputs:
    command: 'restore'
    feedsToUse: 'select'
    feedRestore: 'projectName/feedName'
    projects: '**/*.csproj'
    includeNuGetOrg: true

测试

在存储库中运行测试

# Run tests and auto publish test results.
- task: DotNetCoreCLI@2
  inputs:
    command: 'test'

常见问题解答

为什么生成、发布或测试步骤无法还原包?

大多数 dotnet 命令(包括 buildpublish 、 和 test )都包括隐式 restore 步骤。 即使之前的步骤中成功运行了 ,此操作也会对经过身份验证的源失败,因为之前的步骤将清理它 dotnet restore 使用的凭据。

若要解决此问题,请向"参数 --no-restore "文本框添加 标志。

此外,该命令无法识别 或 参数,在隐式步骤运行时,以此方式指定的源NuGet.config包含在生成的 testfeedRestorevstsFeed 文件中 restore 。 建议使用显式步骤 dotnet restore 来还原包。 该命令 restore 遵守 和 feedRestorevstsFeed 参数。

为什么要签入NuGet.config?

检查NuGet.config源代码管理"可确保每个签出代码的开发人员都可以使用生成项目所需的关键信息(其包的位置)。

但是,对于开发人员团队处理大量项目的情况,还可以将 Azure Artifacts 源添加到每个开发人员计算机上NuGet.config全局资源。 在这些情况下,使用任务中的"此处选择的源"NuGet复制此配置。

疑难解答

输出文件的文件结构与以前的版本不同

Azure DevOps托管代理配置为 .NET Core 3.0、2.1 和 2.2。 使用输出文件夹参数发布项目时,适用于 .NET Core 3.0 的 CLI 具有不同的行为。 使用输出文件夹参数 (-o) 发布项目时,输出文件夹是在根目录中创建的,而不是在项目文件的 ’ 目录中创建的。 因此,发布多个项目时,所有文件将发布到同一目录,这会导致问题。

若要解决此问题,请使用 Add project name to publish path parameter (modifyOutputPath in YAML) 在 .NET Core CLI 任务。 这会在输出文件夹中创建一个包含项目文件名 ’ 的子文件夹。 因此,所有项目都将发布在主输出文件夹内的不同 ’ 子文件夹下。

steps:
- task: DotNetCoreCLI@2
  displayName: 'dotnet publish'
  inputs:
    command: publish
    publishWebProjects: false
    projects: '**/*.csproj'
    arguments: '-o testpath'
    zipAfterPublish: false
    modifyOutputPath: true

Project已实体框架托管代理工作

最新的 .NET Core:3.0 没有内置实体框架 (EF) 版本。 在开始执行之前,必须安装 EF,或者将 global.json 添加到具有所需版本.NET Core SDK项目。 这将确保使用正确的 SDK 来生成 EF 项目。 如果计算机上不存在所需的版本,将 UseDotNetV2 任务添加到管道以安装所需的版本。 详细了解使用 .NET Core 3.0 的 EF

开放源

此任务是 GitHub 上的开放源代码。 欢迎提供反馈和建议。