我最近基于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
手动恢复包目录,但是有没有办法在打开项目之前自动触发此包?
答案 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')"
在导入语句中丢失的原因,要解决此问题,请将条件添加到导入目标。
希望这会有所帮助。