忽略 Azure Pipelines 中 .vdproj 项目的 NuGet 包还原

Car*_*cke 8 msbuild nuget nuget-package-restore azure-devops azure-pipelines

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

- task: NuGetCommand@2
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'
Run Code Online (Sandbox Code Playgroud)

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

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

这似乎是由于新版本的 nuget.exe 中的性能增强所致。基于GitHub 问题的建议是使用 MSBuild 设置跳过不存在的包目标RestoreUseSkipNonexistentTargets

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

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

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

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

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

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

编辑

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

Lan*_*SFT 3

至于你原来的问题: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'
Run Code Online (Sandbox Code Playgroud)

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