【问题标题】:Ignore NuGet package restore on .vdproj projects in Azure Pipelines忽略 Azure Pipelines 中 .vdproj 项目上的 NuGet 包还原
【发布时间】:2019-12-20 03:14:12
【问题描述】:

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

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

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

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

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

GitHub问题提到使用NUGET_RESTORE_MSBUILD_ARGSNuGet CLI environment variable来设置这个属性,但我不知道如何通过NuGet构建任务来实现。

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

- 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。

【问题讨论】:

  • 除了安装程序项目,其他项目的信息是什么?所有 C#/VB 项目?使用 PackageReference 或 Packages.config?
  • @LanceLi-MSFT 唯一的另一个项目是使用 packages.config 的 C# WinForms 应用程序。为清楚起见,已编辑问题。
  • 嗨朋友,你需要这样的命令:nuget restore proj1\packages.config -PackagesDirectory ..\packages。见here
  • 除了为整个解决方案恢复包外,您还可以为一个单独的项目恢复。对于您的情况,这可能更合适。并且由于 `arguments: 'restore "$(solution)" -p:RestoreUseSkipNonexistentTargets=false'` 不起作用的原因,nuget restore 命令无法识别 msbuild 属性。
  • 感谢@LanceLi-MSFT,我会尝试这样做。对于这个示例解决方案,上面应该可以很好地使用,但我想知道在使用包含数十个项目的解决方案时,上述方法是否可以很好地扩展?我可以用 MSBuild 任务替换 NuGet 任务并通过那里进行恢复吗?我注意到 ADO 说这种方法已被弃用,但在大型解决方案或添加新项目时它可能更强大。

标签: msbuild azure-devops nuget azure-pipelines nuget-package-restore


【解决方案1】:

至于您的原始问题:MSB4025

如上所述,这是一个未解决的问题here。任何对此感兴趣的人都可以在那里跟踪问题。

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

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

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'

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

【讨论】:

  • 这里给出了另一种解决方法:github.com/microsoft/msbuild/issues/2064Place a file with these contents next to your .sln file with the special name after.{yoursolutionname}.sln.targets 没有尝试过,但这可能是使用 PackageReference 时要走的路。
【解决方案2】:

一般而言,您不再需要显式调用nuget restore。 MSBuild 作为构建的一部分自动执行它(因此您可能会执行两次)。您可以将p:RestoreUseSkipNonexistentTargets=false 属性添加到VSBuild 任务或DotNet 构建或发布任务的MSBuild 参数中:

- task: DotNetCoreCLI@2
  displayName: Build/Publish
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '$(solution)'
    arguments: '-r $(runtimeIdentifier) /p:RestoreUseSkipNonexistentTargets=false'
    zipAfterPublish: false
    modifyOutputPath: false

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2013-07-15
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多