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

tquggr8v  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(136)

我最近基于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目录添加到修订控制中。我的假设是,如果包丢失,Visual Studio会重新下载(使用nuget或其他方法)。
然而,当我克隆存储库并重新启动时,单元测试项目拒绝打开(“load failed”),因为在其import语句中提到的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目录,但是有没有办法在项目打开之前自动触发这个操作?

lnxxn5zx

lnxxn5zx1#

什么是正确的处理方式?
您应该将条件添加到Import target

<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')"在您的import语句中丢失,要解决此问题,请将条件添加到Import目标。
希望这个有用。

5cg8jx4n

5cg8jx4n2#

我在添加Google测试项目时遇到了同样的问题。根据微软的文档https://learn.microsoft.com/en-gb/nuget/consume-packages/package-restore提到,实际上只有nuget restore myproject.slnmsbuild restore可以像默认的Google测试项目一样工作于packages.config项目。下面两种方法对我很有效:

  1. nuget restore myproject.sln
  2. msbuild -p:RestorePackagesConfig=true -t:restore myproject.sln
    这两个命令都使用GoogleTest包生成了我的packages目录

相关问题