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

时间:2018-07-13 13:27:42

标签: c++ visual-studio-2017 nuget

我最近基于Google测试创建了一个 C ++ Visual Studio 2017单元测试项目(vcxproj)。我使用了文件/新建/项目/已安装/ Visual C ++ / Test / Google测试

这创建了一个 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://docs.microsoft.com/en-gb/nuget/consume-packages/package-restore

他们建议启用“在构建过程中自动检查丢失的软件包”。我的复选框已经选中,所以我猜想它只有在项目加载后才能构建。

这里正确的方法是什么? 我应该签入packages还是有其他方法自动获取软件包(就像VS创建项目时所做的一样)?

更新:我能够在命令行上使用nuget restore -SolutionDir xyz手动恢复包目录,但是有没有办法在打开项目之前自动触发此包?

1 个答案:

答案 0 :(得分:1)

  

这里正确的方法是什么?

您应在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')"在导入语句中丢失的原因,要解决此问题,请将条件添加到导入目标。

希望这会有所帮助。