簡體   English   中英

Azure 管道 Nuget 恢復失敗 MSB4226

[英]Azure Pipelines Nuget Restore Failing MSB4226

我正在嘗試為項目設置 Azure 管道,但在我的 yml 中的 nuget 恢復命令失敗。 以下是完整的錯誤:

[錯誤]nuget 命令失敗,退出代碼 (1) 和錯誤(D:\a\1\s\UDesign\Backup\UDesign\UDesign.csproj(190,11): 錯誤 MSB4226: 導入的項目“C:\未找到 Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets。另外,試圖找到“Microsoft\VisualStudio\v10.0\ WebApplications\Microsoft.WebApplication.targets”在 $(MSBuildExtensionsPath32) 的后備搜索路徑中 - “C:\Program Files (x86)\MSBuild”。這些搜索路徑在“C:\Program Files (x86)”中定義\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe.Config”。確認聲明中的路徑是正確的,並且該文件存在於磁盤上的任一搜索路徑中。)##[錯誤]包無法恢復

幾乎所有關於此錯誤的帖子都在 YML 中的 Build 命令上,但這在 Nuget 恢復中失敗:

管道故障圖像

YML 下面:

# .NET Desktop
# Build and run tests for .NET Desktop or Windows classic desktop solutions.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/windows/dot-net

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'
    feedsToUse: 'select'
    vstsFeed: 'MyFeed'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:OutputPath="$(Build.BinariesDirectory)\$(Build.BuildID)"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    restoreNugetPackages: true
    msbuildArchitecture: 'x64'

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(Build.BinariesDirectory)\$(Build.BuildId)'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    replaceExistingArchive: true

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

我不確定問題出在配置上還是我的 NuGet 包上,我在這個問題上找不到太多信息。

你能試試這個嗎

注意:您需要根據您的項目替換源路徑和目標路徑。

variables:
- name: BuildParameters.RestoreBuildProjects
  value: '**/*.csproj'
- name: BuildParameters.TestProjects
  value: '**/*[Tt]ests/*.csproj'
trigger:
  branches:
    include:
    - refs/heads/master
name: $(date:yyyyMMdd)$(rev:.r)
jobs:
- job: Job_1
  displayName: Agent job 1
  pool:
    vmImage: windows-2019
  steps:
  - checkout: self
  - task: DotNetCoreCLI@2
    displayName: Restore
    inputs:
      command: restore
      projects: $(BuildParameters.RestoreBuildProjects)
  - task: DotNetCoreCLI@2
    displayName: Build
    inputs:
      projects: $(BuildParameters.RestoreBuildProjects)
      arguments: --configuration $(BuildConfiguration)
  - task: DotNetCoreCLI@2
    displayName: Test
    enabled: False
    inputs:
      command: test
      projects: $(BuildParameters.TestProjects)
      arguments: --configuration $(BuildConfiguration)
  - task: DotNetCoreCLI@2
    displayName: Publish
    inputs:
      command: publish
      publishWebProjects: True
      projects: $(BuildParameters.RestoreBuildProjects)
      arguments: --configuration $(BuildConfiguration) --output $(build.artifactstagingdirectory)
      zipAfterPublish: True
  - task: PublishBuildArtifacts@1
    displayName: Publish Artifact
    condition: succeededOrFailed()
    inputs:
      PathtoPublish: $(build.artifactstagingdirectory)
      TargetPath: '\\my\share\$(Build.DefinitionName)\$(Build.BuildNumber)'
...

實際問題

該問題實際上與 NuGet 無關,只是 NuGet 是管道中嘗試評估 MSBuild 文件的第一件事。 如果您仔細查看錯誤:

錯誤 MSB4226:找不到導入的項目“C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets”。

可以看到報錯是 MSBuild can't find Microsoft.WebApplication.targets 這是什么意思? 我不是 100% 有信心,但我非常有信心,這意味着您使用的是“自托管”CI 代理,而不是Microsoft 托管代理,並且任何設置機器的人都安裝了 Visual Studio 2019 而沒有安裝 ASP.NET 工作負載. 因此,任何設置 CI 代理的人都應該安裝“ASP.NET 和 web 開發”工作負載。

建議 1:CI 代理應使用 BuildTools SKU

如果您查看VS 的發布和構建歷史,您會看到每個版本的“安裝程序鏈接”下都有一個“構建工具”鏈接。 這是 Visual Studio 的一個子集,沒有所有的 GUI 東西,專門用於 CI 代理。 我認為 BuildTools SKU 沒有工作負載選項,它只是安裝所有工作負載所需的所有構建工具。

只有在極少數情況下,CI 代理才需要“完整”的 Visual Studio,所以除非您知道自己處於這種情況,否則我建議在您的 CI 代理上安裝 BuildTools,而不是在 Enterprise 或 Professional 上安裝。

建議 2:不要使用NuGetCommand

有兩個原因。 首先, NuGetCommand是一個使用 NuGet.exe 的任務。 NuGet.exe 的問題在於,當您使用PackageReference而不是packages.config時,有時 NuGet 和構建工具(msbuild 的道具/目標)會更改臨時文件的文件格式。 如果您不將 NuGet.exe 的版本與 MSBuild/Visual Studio 的版本保持一致,則可能會出現構建錯誤。 因此,最好使用dotnet restore ,或者如果您不能使用 dotnet cli,則使用msbuild -t:restore 這樣,您始終使用專為安裝的 dotnet/msbuild 版本設計的 NuGet 的確切版本,並且您永遠不必再考慮 NuGet-MSBuild 版本問題。

其次, Azure DevOps 團隊的某個人告訴我的團隊,他們想棄用這些“繁重”的任務,並建議客戶直接在腳本任務中調用命令 特別是,他們實現這些功能的方式將破壞 NuGet 的新 Package 源映射功能。

如果您的解決方案僅包含 SDK 風格的項目,那么我建議您使用:

- task: NuGetAuthenticate
  displayName: Set up NuGet authentication
- script: dotnet restore $(solution)
  displayName: Restore

如果您的解決方案包含任何“舊版”(非 SDK 樣式)項目,則不要使用 dotnet CLI,而是使用- script: msbuild -t:restore $(solution)

建議 3:不要使用 VSBuild

您正在使用任務VSBuild來運行您的構建。 這是使用devenv.com構建項目的任務。 雖然 devenv 確實具有從命令行構建的命令行參數, msbuild.exe是進行命令行構建的“官方”工具。 同樣,除非您知道自己處於確實需要通過devenv /build的特殊情況,否則我建議您改用dotnet CLI 或MSBuild 如前所述,Azure DevOps 團隊顯然希望棄用“繁重”任務,因此我建議您使用腳本並直接調用dotnetmsbuild

- script: msbuild -t:build $(solution)
  displayName: Build solution

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM