[英]error MSB4226 MSBuild.Community.Tasks.Targets" was not found
[英]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 開發”工作負載。
如果您查看VS 的發布和構建歷史,您會看到每個版本的“安裝程序鏈接”下都有一個“構建工具”鏈接。 這是 Visual Studio 的一個子集,沒有所有的 GUI 東西,專門用於 CI 代理。 我認為 BuildTools SKU 沒有工作負載選項,它只是安裝所有工作負載所需的所有構建工具。
只有在極少數情況下,CI 代理才需要“完整”的 Visual Studio,所以除非您知道自己處於這種情況,否則我建議在您的 CI 代理上安裝 BuildTools,而不是在 Enterprise 或 Professional 上安裝。
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)
。
您正在使用任務VSBuild
來運行您的構建。 這是使用devenv.com
構建項目的任務。 雖然 devenv 確實具有從命令行構建的命令行參數, msbuild.exe
是進行命令行構建的“官方”工具。 同樣,除非您知道自己處於確實需要通過devenv /build
的特殊情況,否則我建議您改用dotnet
CLI 或MSBuild
。 如前所述,Azure DevOps 團隊顯然希望棄用“繁重”任務,因此我建議您使用腳本並直接調用dotnet
或msbuild
。
- script: msbuild -t:build $(solution)
displayName: Build solution
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.