我正在嘗試為一個專案設定 Azure 管道,但我的 yml 中的 nuget restore 命令失敗。以下是完整的錯誤:
[錯誤] nuget 命令失敗,退出代碼 (1) 和錯誤 (D:\a\1\s\UDesign\Backup\UDesign\UDesign.csproj(190,11): error MSB4226: Theimported project "C:\ Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets”未找到。另外,試圖找到“Microsoft\VisualStudio\v10.0\ $(MSBuildExtensionsPath32) - "C:\Program Files (x86)\MSBuild" 的后備搜索路徑中的 WebApplications\Microsoft.WebApplication.targets" 。這些搜索路徑在 "C:\Program Files (x86) 中定義\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\msbuild.exe.Config”。確認宣告中的路徑正確,并且該檔案存在于磁盤上的搜索路徑之一中。)##[ error]包無法恢復
幾乎所有關于此錯誤的帖子都在 YML 中的 Build 命令上,但這在 Nuget Restore 上失敗了:
管道故障影像
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 包有關,我在此問題上找不到太多資訊。
uj5u.com熱心網友回復:
你能試試這個嗎
注意:您需要根據您的專案替換源路徑和目標路徑。
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)'
...
uj5u.com熱心網友回復:
實際問題
該問題實際上與 NuGet 無關,只是 NuGet 是您管道中嘗試評估 MSBuild 檔案的第一件事。如果仔細查看錯誤:
錯誤 MSB4226:未找到匯入的專案“C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets”。
您可以看到錯誤是 MSBuild 找不到Microsoft.WebApplication.targets. 這是什么意思?我不是 100% 有信心,但我有很高的信心,這意味著您使用的是“自托管”CI 代理,而不是Microsoft 托管代理,并且設定機器的人安裝了 Visual Studio 2019 而不安裝 ASP。 NET 作業負載。因此,設定 CI 代理的人應該安裝“ASP.NET 和 Web 開發”作業負載。
建議1:CI代理應該使用BuildTools SKU
如果您查看VS 的發布和構建歷史記錄,您會看到每個版本的“安裝程式鏈接”下都有一個“BuildTools”鏈接。這是 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 的新包源映射功能。
如果您的解決方案僅包含 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我建議您使用dotnetCLI 或MSBuild改為使用CLI 。如前所述,Azure DevOps 團隊顯然希望棄用“繁重”的任務,因此我建議您使用腳本并呼叫dotnet或msbuild直接呼叫。
- script: msbuild -t:build $(solution)
displayName: Build solution
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382150.html
標籤:C# 天蓝色 金块 nuget 包还原 azure-pipelines-yaml
上一篇:使用Azure地理冗余(RA-GRS)表存盤時,如何更新ASP.NETCore中的TableServiceClient以指向次要區域?
