.NET Core CLI 工作

Azure DevOps Services |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018

注意

NuGet驗證工作是使用Azure Artifacts和其他NuGet存放庫進行驗證的新建議方式。 此 .NET Core CLI 工作的還原和推送命令不再採用新功能,而且只會解決重大 Bug。

Azure Pipelines

使用此工作來建置、測試、封裝或發佈 dotnet 應用程式,或執行自訂 dotnet 命令。 對於套件命令,此工作支援 NuGet.org 和已驗證的摘要,例如套件管理和 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 以新增引數,或使用此處未列出的命令。
選項: build 、、 pushpublishpackrestoreruntestcustom
selectOrConfig
要使用的摘要
您可以選擇從此處的 Azure Artifacts 和/或 NuGet.org 選取摘要,或將NuGet.config檔案認可至原始程式碼存放庫,並使用 nugetConfigPath 引數設定其路徑。
選項: selectconfig
引數別名: feedsToUse
versioningScheme
自動套件版本設定
無法與包含的參考專案搭配使用。 如果您選擇 [使用日期和時間],這會產生格式化為 X.Y.Z-ci-datetime X、Y 和 Z 格式的SemVer相容版本。

如果您選擇 [使用環境變數],則必須選取環境變數,並確定它包含您想要使用的版本號碼。

如果您選擇 [使用組建編號],這會使用組建編號來設定套件的版本。 注意: 在 [選項] 底下,將組建編號格式設定為 '$ (BuildDefinitionName) _$ (Year:yyyyy) .$ (Month) .$ (DayOfMonth) $ (Rev:.r) '
選項: off 、、 byEnvVarbyPrereleaseNumberbyBuildNumber 、、

arguments
引數
所選命令的引數。 例如,建置組態、輸出檔案夾、執行時間。 引數取決於選取的命令
注意:此輸入目前只接受 、、 publish 、、 customtest 的引數 buildrun 如果您想要為未列出的命令新增引數,請使用 custom
projects
專案 () 的路徑
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 檔案路徑的模式。 多個模式可以以分號分隔,而且您可以在其前面 ! 加上 來建立模式負數。 範例:**/*.nupkg;!**/*.Tests.nupkg.
引數別名: packagesToPush
nuGetFeedType
目標摘要位置
指定目標摘要為內部或外部。
選項: internalexternal
feedPublish
目標摘要
選取您組織中裝載的摘要。 您必須安裝套件管理並取得授權,才能在這裡選取摘要
引數別名: publishVstsFeed
publishPackageMetadata
發佈管線中繼資料
將此組建/發行管線的中繼資料 (執行識別碼、原始程式碼資訊) 與套件產生關聯
externalEndpoint
NuGet 服务器
包含外部NuGet伺服器認證的NuGet服務連線
引數別名: publishFeedCredentials
searchPatternPack
要封裝的 csproj 或 nuspec 檔案 () 路徑
搜尋要封裝之 csproj 或 nuspec 檔案的模式。 您可以使用分號分隔多個模式,並以 作為前置詞 ! ,使模式為負值。 範例:**/*.csproj;!**/*.Tests.csproj
引數別名: packagesToPack
configurationToPack
組態至封裝
使用 csproj 檔案時,這會指定要封裝的組態。
引數別名: configuration
outputDir
封裝資料夾
將建立封裝的資料夾。 如果空白,則會與 csproj 檔案一起建立套件。
引數別名: packDirectory
nobuild
不要建置
請不要在封裝之前建置專案。 對應至 --no-build 'build' 命令的參數。
includesymbols
包含符號
此外,NuGet套件建立符號。 對應至 --include-symbols 命令列參數。
includesource
包含來源
在套件中包含原始程式碼。 對應至 --include-source 命令列參數。
publishWebProjects
發佈 Web 專案
如果 trueprojects ,則會略過 屬性值,而且工作會嘗試在存放庫中尋找 Web 專案,並在其上執行發佈命令。 Web 專案會透過目錄中的web.config檔案或 wwwroot 資料夾來識別。 如果沒有web.config檔案或 wwwroot 資料夾,則會選取使用 Web SDK 的專案,例如 Microsoft.NET.Sdk.Web。 請注意,如果未指定,這個引數預設為 true
zipAfterPublish
Zip 已發佈的專案
如果 true 為 ,則發行命令所建立的資料夾將會壓縮和刪除。
modifyOutputPath
新增專案名稱以發佈路徑
如果 true 為 ,在引數中明確指定輸出路徑時,發行命令所建立的資料夾會有前置詞為其資料夾名稱的專案檔名稱。 如果您想要將多個專案發佈至相同的資料夾,這會很有用。
publishTestResults
發佈測試結果
啟用此選項會在 中 $(Agent.TempDirectory) 產生測試結果 TRX 檔案,並將結果發佈至伺服器。
此選項會 --logger trx --results-directory $(Agent.TempDirectory) 附加至命令列引數。
程式碼涵蓋範圍可以藉由新增 --collect "Code coverage" 至命令列引數來收集。
testRunTitle
測試回合標題
提供測試回合的名稱
custom
自訂命令
要傳遞至執行dotnet.exe的命令。
如需可用命令的完整清單,請參閱 dotnet CLI 檔
feedRestore
使用此Azure Artifacts/TFS 摘要中的套件
在產生的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
Minor
X.Y.Z版中的 'Y'。
引數別名: minorVersion
requestedPatchVersion
Patch
X.Y.Z版中的 'Z'。
引數別名: patchVersion

範例

Build

建置專案

# 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 的命令,包括 buildpublishtest 包含隱含 restore 步驟。 即使您在先前的步驟中執行成功 dotnet restore ,這仍會針對已驗證的摘要失敗,因為先前的步驟會清除所使用的認證。

若要修正此問題,請將 --no-restore 旗標新增至 [引數] 文字方塊。

此外,當隱含 restore 步驟執行時, test 命令無法辨識 feedRestore 以這種方式指定的 或 vstsFeed 引數和摘要,將不會包含在產生的NuGet.config檔案中。 建議您使用明確的 dotnet restore 步驟來還原套件。 命令 restorefeedRestore 遵守 和 vstsFeed 引數。

為什麼我應該簽入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) 時,輸出檔案夾會在根目錄中建立,而不是在專案檔的目錄中建立。 因此,在發佈多個專案時,所有檔案都會發佈至相同的目錄,這會導致問題。

若要解決此問題,請使用 [新增專案名稱] 將路徑參數發佈 (YAML) 中的 modifyOutputPath) 。 這會在輸出檔案夾內建立具有專案檔名稱的子資料夾。 因此,您的所有專案都會在主要輸出檔案夾內的不同子資料夾下發布。

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

使用 Entity Framework 的Project已在託管代理程式上停止運作

最新的 .NET Core:3.0 沒有 Entity Framework (EF) 內建。 您必須先安裝 EF,再開始執行,或將 global.json 新增至具有必要 .NET Core SDK 版本的專案。 這可確保使用正確的 SDK 來建置 EF 專案。 如果電腦上沒有必要的版本,請將 UseDotNetV2 工作新增至管線以安裝必要的版本。 深入瞭解使用 .NET Core 3.0 的 EF

開放原始碼

此工作在GitHub上開放原始碼。 歡迎意見反應和貢獻。