如何为 Visual Studio C++ 项目重新生成软件包目录?

3
我最近创建了一个基于Google Test的C++ Visual Studio 2017单元测试项目(vcxproj)。我使用了“文件/新建/项目/已安装/Visual C++/测试/Google Test”进行创建。
这将创建一个package.config文件:
<?xml version="1.0" encoding="utf-8"?>
  <packages>
    <package id="Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn" version="1.8.0" targetFramework="native" />
  </packages>

它还在我的解决方案中创建了一个名为packages的目录,并将googletest包放置其中。该目录包含二进制库(没有源代码),因此我没有将packages目录添加到版本控制中。我的假设是,如果缺少该包(使用nuget或其他方式),Visual Studio会重新下载该包。但是,当我克隆存储库并开始新建时,单元测试项目无法打开(“加载失败”),因为其导入语句中提到的packages目录不存在:
<Import Project="..\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.0\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets" />

我看了这篇文章,似乎包含了一些提示:https://learn.microsoft.com/en-gb/nuget/consume-packages/package-restore

他们建议启用“在构建期间自动检查缺失的包”。我的复选框已经被选中了,所以我猜想在加载项目之前无法构建。

在这里应该怎么做才是正确的? 我应该检查 packages 还是有其他方法可以自动获取包(就像 VS 创建我的项目时所做的那样)?

更新:我能够通过命令行手动恢复 nuget restore -SolutionDir xyz 来恢复 packages 目录,但是否有一种方法在打开项目之前自动触发此操作?


这个问题有任何更新吗?您解决了这个问题吗?如果没有,能否请您告诉我关于这个问题的最新信息? - Leo Liu
成功。该条件允许项目打开,并且在构建时安装了包。 - BareMetalCoder
我也从头开始创建了一个新项目,并在导入语句中找到了“Condition”属性,所以我的问题一定是由于有人手动更改了文件。谢谢! - BareMetalCoder
2个回答

1

在这里应该采取什么正确的方法?

您应该向导入目标添加条件:

  <ImportGroup Label="ExtensionTargets">
    <Import Project="..\packages\xxx\xx.targets" Condition="Exists('..\packages\xxx\xx.targets')" />
  </ImportGroup>

当我们创建 Google Test 项目时,默认会将 .targets 文件导入到项目文件 .vcxproj 中。您可以卸载您的项目并编辑它,您将遵循导入语句:
  <ImportGroup Label="ExtensionTargets">
    <Import Project="..\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.0\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets" Condition="Exists('..\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.0\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets')" />
  </ImportGroup>

不确定为什么你的导入语句中丢失了 Condition="Exists('..\packages\xx.targets')",为解决此问题,请将条件添加到导入目标中。

希望这可以帮到你。


谢谢,我明天会尝试这个。我查看了我们的历史记录,但没有找到一个条件属性。 - BareMetalCoder
我确实在底部有一个 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 部分,其中包含一个名为 <Error Condition="!Exists('..\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.0\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.0\build\native\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.targets'))" /> 的元素 -- 相关吗? - BareMetalCoder
以防万一,你可以移动它。这样做是为了确保.targets文件成功导入。 - Leo Liu

0

我曾经遇到过添加Google Test项目的完全相同的问题。按照Microsoft文档https://learn.microsoft.com/en-gb/nuget/consume-packages/package-restore所述,实际上只有nuget restore myproject.slnmsbuild restore可以用于像Google Test项目默认的packages.config项目。以下两种方法适用于我:

  1. nuget restore myproject.sln
  2. msbuild -p:RestorePackagesConfig=true -t:restore myproject.sln

这两个命令都生成了我的packages目录,并包含了Google Test包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接