如何将MSBuild设置为自动下载解决方案/项目中引用的新nuget包



我正在从为我的项目从源代码构建googletest转换为在Visual Studio 2019中使用nuget包Microsoft.googletest.v140.windsktop.msvcstl.static.rt dyn.1.8.1。预警,这是我第一次尝试Nuget,所以这个问题可能是我错过的一些非常基本的东西。

在VS IDE中构建/运行时,一切都很正常(AFAIK)。然而,在我的构建机器上(使用MSbuild自动构建并从源代码管理提交中触发构建),测试项目无法构建,并出现错误:

注意:显然下面的路径已经更改,但我确保目录嵌套级别是相同的

C:\Path\To\Project\SolutionName\ProjectName\TestsProject\TestProject.vcxproj(215,5):错误:此项目引用了此计算机上丢失的NuGet包。使用NuGet Package Restore下载它们。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105.缺少的文件是。。。。\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt dyn.1.8.1\build\native\Microsoft.googletest.v140.Windektop.msvcstl.static.rt-dyn.targets.

自动生成过程使用以下MSBuild命令生成:

msbuild ""C:PathToProjectSolutionNameSolutionFile.sln"" /target:Rebuild /Property:Configuration=Release;Platform=x64 /m /consoleloggerparameters:ErrorsOnly /fileLogger /fileloggerparameters:LogFile=""C:PathToProjectSolutionNameBuildLog.txt"" /flp1:LogFile=""C:PathToProjectSolutionNameBuildErrors.txt"";ErrorsOnly /flp2:LogFile=""C:PathToProjectSolutionNameBuildWarnings.txt"";WarningsOnly

我已经无数次浏览了错误中的链接(特别是文档中与MSBuild有关的部分)。这让我在上面的命令中添加了一个额外的恢复目标(更改为../target:Restore;Rebuild…),但这并没有奏效(不记得确切的错误,但如果有人在阅读更多内容后认为它相关,我显然可以再次复制它)。我尝试了其他几次迭代,但我相信这是正确的方法,但它不起作用,所以我在这里寻求帮助。现在,在上面的Build命令之前,我有以下命令正在执行:

msbuild "C:PathToProjectSolutionNameSolutionFile.sln" /target:Restore /Property:Configuration=Release;Platform=x64

该命令的输出为:

用于.NET Framework 的Microsoft(R)Build Engine版本16.5.0+d4cbfca49

版权所有(C)Microsoft Corporation。保留所有权利。

在此解决方案中一次生成一个项目。启用并行构建,请添加"-m"开关。

构建开始于2020年6月3日凌晨1:02:06。

上的项目"C:\Path\To\Project\SolutionName\SolutionFile.sln"节点1(还原目标)。验证解决方案配置:

正在生成解决方案配置"Release |x64"。验证项目:

未选择项目"unlated_project_in_solution_1"用于在解决方案配置"Release |x64"中生成。

未选择项目"unlated_project_in_solution_2"用于在解决方案配置"Release |x64"中生成。

未选择项目"unlated_project_in_solution_3"作为内置解决方案配置"Release |x64"。

恢复:

无需执行任何操作。指定的任何项目都不包含要还原的包。

完成生成项目"C:\Path\To\Project\SolutionName\SolutionFile.sln"(还原目标)。

生成成功。0个警告0错误

运行时间00:00:01.99

当然(因为恢复没有做任何事情)接下来的是项目无法构建,出现了与我添加命令之前相同的错误。

那么我在这里错过了什么?我的逻辑思考过程告诉我项目文件没有引用nuget包,但它似乎在那里(在IDE和.vcxproj文件中),所以我不知道为什么restore命令找不到它。

更新1-好,通读后https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets显然,msbuild-restore选项只适用于PackageReference样式的项目,默认情况下,VS2019仍然为C++项目创建packages.config样式的项目。

因此,我似乎需要将项目切换到使用PackageReference,但我仍然不清楚如何做到这一点,因为C++项目可能根本不支持PackageReference?还是仅仅是迁移工具不适用于C++项目?https://learn.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference

或者,我需要找到一种使用package.config样式项目自动管理安装的方法,但我也不知道如何做到这一点。

UPDATE2-MSBuild中的本机C++项目根本不支持PackageReference。这里有一个正在进行的讨论(最近一次由MSFT代表于2020年3月更新),称他们将增加对C++/Cli的支持,但原生C++需要做更多的工作。https://developercommunity.visualstudio.com/idea/351636/use-packagereference-in-vcxproj.html所以,我想我一直在管理MSBuild的外部。

回到这里,发布更新2作为答案,因为到目前为止它仍然是最新的。

UPDATE2-MSBuild中的本机C++项目根本不支持PackageReference。这里有一个正在进行的讨论(最近一次由MSFT代表于2020年3月更新),称他们将增加对C++/Cli的支持,但原生C++需要做更多的工作。https://developercommunity.visualstudio.com/idea/351636/use-packagereference-in-vcxproj.html所以,我想我一直在管理MSBuild的外部。

最新更新