【发布时间】: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