NuGet 工作

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

注意

NuGet 驗證工作是使用 Azure Artifacts 和其他 NuGet 存放庫進行驗證的新建議方式。 這項工作不再採用新功能,而且只會解決重大錯誤。

使用此工作來安裝和更新 NuGet 套件相依性,或封裝併發布 NuGet 套件。 使用NuGet.exe,並搭配.NET Framework應用程式使用。 針對 .NET Core 和 .NET Standard 應用程式,請使用 .NET Core 工作。

注意

在 Microsoft Team Foundation Server (TFS) 2018 和舊版中,組建和發行管線稱為定義、執行稱為組建服務連線稱為服務端點階段稱為環境,而作業稱為階段

如果您的程式碼相依于 NuGet 套件,請務必在 Visual Studio 建置步驟之前新增此步驟。 此外,請務必清除此步驟中已被取代的 [還原 NuGet 套件 ] 核取方塊。

如果您使用 .NET Core 或 .NET Standard,請使用 .NET Core 工作,其具有所有套件案例的完整支援,而且 dotnet 目前支援此工作。

提示

此版本的 NuGet 工作預設會使用 NuGet 4.1.0。 若要選取不同版本的 NuGet,請使用 工具安裝程式

YAML 程式碼片段

# NuGet
# Restore, pack, or push NuGet packages, or run a NuGet command. Supports NuGet.org and authenticated feeds like Azure Artifacts and MyGet. Uses NuGet.exe and works with .NET Framework apps. For .NET Core and .NET Standard apps, use the .NET Core task.
- task: NuGetCommand@2
  inputs:
    #command: 'restore' # Options: restore, pack, push, custom
    #restoreSolution: '**/*.sln' # Required when command == Restore
    #feedsToUse: 'select' # Options: select, config
    #vstsFeed: # Required when feedsToUse == Select
    #includeNuGetOrg: true # Required when feedsToUse == Select
    #nugetConfigPath: # Required when feedsToUse == Config
    #externalFeedCredentials: # Optional
    #noCache: false 
    #disableParallelProcessing: false 
    restoreDirectory: 
    #verbosityRestore: 'Detailed' # Options: quiet, normal, detailed
    #packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg' # Required when command == Push
    #nuGetFeedType: 'internal' # Required when command == Push# Options: internal, external
    #publishVstsFeed: # Required when command == Push && NuGetFeedType == Internal
    #publishPackageMetadata: true # Optional
    #allowPackageConflicts: # Optional
    #publishFeedCredentials: # Required when command == Push && NuGetFeedType == External
    #verbosityPush: 'Detailed' # Options: quiet, normal, detailed
    #packagesToPack: '**/*.csproj' # Required when command == Pack
    #configuration: '$(BuildConfiguration)' # Optional
    #packDestination: '$(Build.ArtifactStagingDirectory)' # Optional
    #versioningScheme: 'off' # Options: off, byPrereleaseNumber, byEnvVar, byBuildNumber
    #includeReferencedProjects: false # Optional
    #versionEnvVar: # Required when versioningScheme == ByEnvVar
    #majorVersion: '1' # Required when versioningScheme == ByPrereleaseNumber
    #minorVersion: '0' # Required when versioningScheme == ByPrereleaseNumber
    #patchVersion: '0' # Required when versioningScheme == ByPrereleaseNumber
    #packTimezone: 'utc' # Required when versioningScheme == ByPrereleaseNumber# Options: utc, local
    #includeSymbols: false # Optional
    #toolPackage: # Optional
    #buildProperties: # Optional
    #basePath: # Optional, specify path to nuspec files
    #verbosityPack: 'Detailed' # Options: quiet, normal, detailed
    #arguments: # Required when command == Custom

引數

引數 描述
command
命令
要執行的 NuGet 命令。 選取 [自訂] 以新增引數或使用不同的命令。
選項: restore 、、 packcustompush
restoreSolution
solution、packages.config 或 project.json 的路徑
參考要還原之封裝的方案、packages.config或 project.json 檔案路徑。
feedsToUse
要使用的摘要
您可以從 Azure Artifacts 和/或 NuGet.org 選取摘要,或將nuget.config檔案認可至原始程式碼存放庫,並在這裡設定其路徑。
選項: selectconfig
vstsFeed
使用此 Azure Artifacts/TFS 摘要中的套件
在產生的NuGet.config中包含選取的摘要。您必須安裝 Azure Artifacts 並取得授權,才能在這裡選取摘要。
includeNuGetOrg
使用來自 NuGet.org 的套件
在產生的NuGet.config中包含 NuGet.org。預設值為 true
當 時為 必要 feedsToUse == Select 專案。
nugetConfigPath
NuGet.config的路徑
存放庫中的 NuGet.config,指定要從中還原封裝的摘要。
必要時機 feedsToUse == Config
externalFeedCredentials
此組織/集合外部摘要的認證
要用於所選取NuGet.config外部登錄的認證。這是 NuGet 服務連線的名稱。 針對此組織/集合中的摘要,請將此保留空白;會自動使用組建的認證。
noCache
停用本機快取
防止 NuGet 使用來自本機電腦快取的套件。
disableParallelProcessing
停用平行處理
防止 NuGet 平行安裝多個套件。
restoreDirectory
目的地目錄
指定安裝封裝的資料夾。 如果未指定任何資料夾,則會將套件還原到 packages/ 資料夾,以及選取的解決方案、packages.config或 project.json。
verbosityRestore
詳細程度
指定輸出中顯示的詳細資料量。
選項: Quiet 、、 NormalDetailed
nuGetFeedType
目標摘要位置
指定目標摘要是內部摘要/集合還是外部 NuGet 伺服器。
選項: internalexternal
必要時機 command == Push
publishVstsFeed
目標摘要
選取此帳戶中裝載的摘要。 您必須安裝 Azure Artifacts 並取得授權,才能在這裡選取摘要。
packagesToPush
套件位置
要比對 nupkg 檔案或路徑的模式。
範例:'$ (Build.ArtifactStagingDirectory) /*.nupkg'。
必要時機 command == Push
publishPackageMetadata
發佈管線中繼資料
如果您持續發佈一組套件,而且只會變更已變更之套件子集的版本號碼,請使用此選項。
allowPackageConflicts 即使部分套件遭到拒絕,也允許工作回報成功,並出現 409 衝突錯誤。
如果NuGet.exe發生衝突,工作將會失敗。 如果您位於 Proxy 環境中,此選項將無法運作,且發佈將會失敗。
publishFeedCredentials
NuGet 伺服器
包含外部 NuGet 伺服器認證的 NuGet 服務連線。
verbosityPush
詳細程度
指定輸出中顯示的詳細資料量。
選項: Quiet 、、 NormalDetailed
packagesToPack
要封裝的 csproj 或 nuspec 檔案 () 路徑
搜尋要封裝之 csproj 目錄的模式。
您可以使用分號分隔多個模式,並以 作為前置詞,使模式為負值。
範例: **\\*.csproj;!**\\*.Tests.csproj
configuration
要封裝的組態
使用 csproj 檔案時,這會指定要封裝的組態。
packDestination
套件資料夾
將建立封裝的資料夾。 如果空白,則會在來源根目錄建立封裝。
versioningScheme
自動套件版本設定
無法與包含的參考專案搭配使用。 如果您選擇 Use the date and time ,這會產生符合 SemVer 規範 的版本,其格式為 X.Y.Z-ci-datetime 您選擇的 X、Y 和 Z。
如果您選擇 Use an environment variable ,您必須選取環境變數,並確定它包含您想要使用的版本號碼。
如果您選擇 Use the build number ,這會使用組建編號來設定套件的版本。
注意: 您可以使用 name 屬性來設定組建編號格式,如下所示:
name:$ (BuildDefinitionName) _$ (Date:yyyyMMMdd) $ (Rev:.rr) 。
選項: off 、、 byPrereleaseNumberbyEnvVarbyBuildNumber
includeReferencedProjects
環境變數
輸入不含 $、$env 或 %的變數名稱。
majorVersion
主要
X.Y.Z版中的 'X'
minorVersion
Minor
X.Y.Z版中的 'Y'
patchVersion
Patch
X.Y.Z版中的 'Z'
packTimezone
時區
指定用來產生套件版本所需的時區。 如果您使用裝載的組建代理程式作為其日期和時間可能不同,建議您選取 UTC。
選項: utclocal
includeSymbols
建立符號套件
指定封裝包含來源和符號。 與 .nuspec 檔案搭配使用時,這會建立一般的 NuGet 套件檔案和對應的符號套件。
toolPackage
工具套件
判斷專案的輸出檔案是否應該位於工具資料夾中。
buildProperties
其他建置屬性
指定 token=value 組的清單,並以分號分隔,其中 .nuspec 檔案中每個出現的 $token$ 都會取代為指定的值。 值可以是引號中的字串。
basePath
基底路徑
nuspec 檔案中定義的檔案基底路徑。
verbosityPack
詳細程度
指定輸出中顯示的詳細資料量。
選項: Quiet 、、 NormalDetailed
arguments
命令和引數
將傳遞至執行NuGet.exe的命令和引數。 如果使用 NuGet 3.5 或更新版本,則會針對此組織/集合中專案集合組建服務有權存取的任何摘要,自動驗證清單、還原及發行等已驗證的命令。

版本設定配置

針對 byPrereleaseNumber,版本會設定為您為主要、次要和修補程式選擇的任何專案,以及格式 yyyymmdd-hhmmss 為 的日期和時間。

若為 byEnvVar,版本會設定為 具有 versionEnvVar 參數所指定名稱的環境變數值,例如 MyVersion , (否 $ ,而只是環境變數名稱) 。 請確定環境變數已設定為適當的 SemVer,例如 1.2.31.2.3-beta1

針對 byBuildNumber,版本將會使用管線執行的組建編號來設定。 這是為管線的 name 屬性指定的值,它會儲存至 BUILD_BUILDNUMBER 環境變數) 。 請確定所使用的組建編號包含適當的 SemVer,例如 1.0.$(Rev:r) 。 使用 byBuildNumber時,工作會從組建編號字串中擷取虛線版本 1.2.3.4 ,並只使用該部分。 將會卸載其餘的字串。 如果您想要依原樣使用組建編號,可以使用 byEnvVar ,如上所述,並將 versionEnvVar 設定為 BUILD_BUILDNUMBER

範例

還原

使用所選摘要中的套件還原所有解決方案。

# Restore from a project scoped feed in the same organization
- task: NuGetCommand@2
  inputs:
    command: 'restore'
    feedsToUse: 'select'
    vstsFeed: 'my-project/my-project-scoped-feed'
    includeNuGetOrg: false
    restoreSolution: '**/*.sln'
# Restore from an organization scoped feed in the same organization
- task: NuGetCommand@2
  inputs:
    command: 'restore'
    feedsToUse: 'select'
    vstsFeed: 'my-organization-scoped-feed'
    restoreSolution: '**/*.sln'
# Restore from a feed in a different organization
- task: NuGetCommand@2
  inputs:
    command: 'restore'
    feedsToUse: config
    nugetConfigPath: ./nuget.config
    restoreSolution: '**/*.sln'
    externalFeedCredentials: 'MyServiceConnectionName'
    noCache: true
  continueOnError: true
# Restore from feed(s) set in nuget.config
- task: NuGetCommand@2
  inputs:
    command: 'restore'
    feedsToUse: 'config'
    nugetConfigPath: 'nuget.config'

封裝

在目的地資料夾中建立 NuGet 套件。

# Package a project
- task: NuGetCommand@2
  inputs:
    command: 'pack'
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'

發送

注意

管線成品會下載至 Pipeline.Workspace 目錄,以及傳統 System.ArtifactsDirectory 發行管線的目錄。 packagesToPush 值可以分別設定為 $(Pipeline.Workspace)/**/*.nupkg$(System.ArtifactsDirectory)/**/*.nupkg

  • 將套件推送/發佈至NuGet.config中定義的摘要。

    # Push a project
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg'
        feedsToUse: 'config'
        nugetConfigPath: '$(Build.WorkingDirectory)/NuGet.config'
    
  • 將套件推送/發佈至組織範圍摘要

    # Push a project
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        nuGetFeedType: 'internal'
        publishVstsFeed: 'my-organization-scoped-feed'
    
  • 將套件推送/發佈至專案範圍摘要

    # Push a project
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        nuGetFeedType: 'internal'
        publishVstsFeed: 'my-project/my-project-scoped-feed'
    
  • 將套件推送/發佈至 NuGet.org

    # Push a project
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        feedsToUse: 'config'
        includeNugetOrg: 'true'
    

Custom

執行預設 NuGet 命令以外的任何其他 NuGet 命令:套件、推送和還原。

# list local NuGet resources.
- task: NuGetCommand@2
  displayName: 'list locals'
  inputs:
    command: custom
    arguments: 'locals all -list'

開放原始碼

查看 GitHub 上的Azure Pipelines 和 Team Foundation Server 現用工作。 歡迎意見反應和貢獻。

常見問題集

為什麼我應該簽入NuGet.Config?

將NuGet.Config簽入原始檔控制可確保建置專案所需的主要資訊片段,其套件的位置可供取出程式碼的每個開發人員使用。

不過,對於開發人員小組處理大量專案的情況,您也可以在每個開發人員的電腦上將 Azure Artifacts 摘要新增至全域NuGet.Config。 在這些情況下,使用 NuGet 工作中 [我在此選取的摘要] 選項會複寫此設定。

我可以在哪裡瞭解 Azure Artifacts?

Azure Artifacts 文件

我可以在哪裡深入瞭解 NuGet?

NuGet 檔 概述

NuGet 建立 封裝和發佈

NuGet 取用 設定解決方案以取得相依性

我可以建置哪些其他類型的應用程式?

建置和部署您的應用程式範例

有哪些其他類型的建置工作可供使用?

建置和發行工作目錄

如何保護程式碼基底免于建置中斷?

如何?修改組建管線的其他部分嗎?

我選取了平行多重組態,但一次只會執行一個組建。

如果您使用 Azure Pipelines,您可能需要更多平行作業。 請參閱 Azure Pipelines 中的平行作業

如何?查看組建管線中有哪些變更?

檢視組建管線的變更歷程記錄

我需要代理程式嗎?

您至少需要一個 代理程式 來執行組建或發行。

我遇到問題。 如何對其進行疑難排解?

請參閱 針對組建和發行進行疑難排解

我無法選取預設代理程式組件區,且無法將組建或發行排入佇列。 我要如何修正此問題?

請參閱 代理程式組件區

我的 NuGet 推送工作失敗,並出現下列錯誤:「錯誤:無法取得本機簽發者憑證」。 我該怎麼辦?

您可以藉由新增受信任的根憑證來修正此問題。 您可以將環境變數新增 NODE_EXTRA_CA_CERTS=file 至組建代理程式,也可以在管線中新增 NODE.EXTRA.CA.CERTS=file 工作變數。 如需此變數的詳細資訊 ,請參閱Node.js檔 。 如需在管 線中設定變數 的指示,請參閱在管線中設定變數。

我在內部部署使用 TFS,但看不到其中一些功能。 為什麼不用?

其中部分功能僅適用于 Azure Pipelines ,但尚未提供內部部署。 如果您 已升級至最新版本的 TFS,則某些功能可在內部部署使用。

我的管線需要存取不同專案中的摘要

如果管線在裝載摘要的專案不同的專案中執行,您必須設定其他專案,以授與建置服務的讀取/寫入存取權。 如需詳細資訊,請參閱 Azure Pipelines 中的套件許可權