首页 > 解决方案 > 忽略 Azure Pipelines 中 .vdproj 项目上的 NuGet 包还原

问题描述

我正在尝试针对包含Visual Studio Installer Project的 .NET Framework 4.7.2 解决方案设置 Azure DevOps 构建管道。我在安装了 Visual Studio 2019 Community 的 Windows Server 2019 VM 上设置了自托管代理。生成管道包含 NuGet 安装程序任务,然后是 NuGet 任务,设置为还原引用的 NuGet 包。以下是 YAML 片段:

- task: NuGetCommand@2
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'

但是,使用此配置运行构建会导致构建日志中出现以下错误:

[错误] nuget 命令失败,退出代码 (1) 和错误 (C:\##############.vdproj(1,1): 错误 MSB4025: 项目文件无法已加载。根级别的数据无效。第 1 行,位置 1。)

这似乎是由于在较新版本的 nuget.exe 中进行了性能增强。基于RestoreUseSkipNonexistentTargetsGitHub 问题的建议是启用使用MSBuild 设置跳过不存在的包目标。

GitHub 问题提到使用NUGET_RESTORE_MSBUILD_ARGS NuGet CLI 环境变量来设置此属性,但我不知道如何通过 NuGet 构建任务来实现。

由于 NuGet 现在已与 MSBuild 集成,因此我尝试false通过 NuGet 任务的命令行参数将此属性设置为。我修改了 YAML,将命令设置为custom以传递参数。我基于MSBuild 还原文档的语法。现在看起来如下:

- task: NuGetCommand@2
  inputs:
    command: 'custom'
    arguments: 'restore "$(solution)" -p:RestoreUseSkipNonexistentTargets=false'

此构建配置会导致以下错误:

[错误] nuget 命令失败,退出代码 (1) 和错误(未知选项:'-p:RestoreUseSkipNonexistentTargets=false')

我的问题是,如何让 NuGet 还原任务跳过 .vdproj 项目的包还原?

编辑

解决方案中的另一个项目是 C# WinForms .NET Framework 项目。我们使用的是 packages.config 而不是 PackageReference。

标签: msbuildazure-devopsnugetazure-pipelinesnuget-package-restore

解决方案


至于你原来的问题:MSB4025

正如你上面提到的,这是一个悬而未决的问题。任何对此感兴趣的人都可以在那里跟踪问题。

[错误] nuget 命令失败,退出代码 (1) 和错误(未知选项:'-p:RestoreUseSkipNonexistentTargets=false')

nuget restore 命令无法识别 msbuild 属性。在此处查看类似问题和更多详细信息。

自从The other project in the solution is a C# WinForms .NET Framework project. We're using packages.config rather than PackageReference.

解决方法是使用如下 nuget 自定义命令:

- task: NuGetCommand@2
  inputs:
    command: 'custom'
    arguments: 'restore YourProjectName\packages.config -PackagesDirectory $(Build.SourcesDirectory)\packages'

这可以跳过安装程序项目的恢复步骤。


推荐阅读