C++项目中NuGet包的PackageReference

11

我参与了一个项目,我们在Visual Studio中使用packages.config文件来管理NuGet包的依赖关系,并通过在项目文件中的Import语句中包含每个包的依赖项。

如果您始终需要这些包,则这种方法很好用,但是如果开发人员不需要或不想要某些有条件的包,则我们希望将它们排除在外。我找到了PackageReference标记,它会使依赖项更加清晰,并允许我们有条件地包含这些包。

它似乎在C#项目中得到了充分支持,但我无法确定它是否支持C++项目。

我尝试删除了所有的packages.config文件,并用PackageReference标记替换了所有的引用,但是包管理器似乎没有识别出PackageReference标记。我还尝试了所有可以找到的Visual Studio迁移工具,但都没有成功。

是否可能在C++项目中使用它?如果不能,是否有解决办法可以有条件地排除某些包?

我的Visual Studio版本是Professional 15.6.7。

3个回答

9
目前,PackageReference还不支持C++项目。NuGet团队正在评估是否在未来的版本中支持它。你可能已经通过一些方法让它工作了,但如果你创建一个新的C++项目并尝试将此包安装为PackageReference,它将不允许你这样做。因此,我建议您继续为您的C++项目和库使用packages.config。
此外,您可以在Visual Studio UserVoice网站上添加您的请求或投票支持此功能: Use PackageReference in vcxproj。当有足够的社区投票并添加评论以支持此反馈时,产品团队成员将认真考虑此反馈。
对于无法使用PackageReference的情况,您可以在自定义目标文件中包含条件引用,并将dll部署在软件包的tools文件夹中,这样它们就不会被Nuget自动添加为引用。 参考链接: NuGet update and conditional references 希望这能帮到您。

1
投票已经关闭。太好了。 - itsho
2
开发者社区提案链接,用于替代uservoice。 - Matthieu
@Leo Liu-MSFT 这方面有最新的支持消息吗? - ROX
1
虽然它没有得到官方支持,但它对于桌面和UWP C++项目确实有效。 请参阅React Native Windows存储库。https://github.com/microsoft/react-native-windows - juniel_katarn
实际上,MSBuild 使用 PackageReference 可以与各种类型的项目一起工作,详见我的答案。但是,完全集成到 Visual Studio 中的功能却无法正常运行。 - Borislav Ivanov

1
为了总结其他答案并提供一些最新信息: PackageReference在C++项目中没有得到官方支持,因为它与NuGet和Visual Studio的整合不完全,但是
MSBuild支持PackageReference,Visual Studio 16.9及更高版本(这是2019年)也实现了一些集成。
完整步骤在Make the PackageReference support general purpose for all languages PR的评论中有描述,但基本上是:
在项目文件夹上面创建一个名为Directory.Build.props的文件,并包含以下内容:
<Project>  
  <Import Project="$(MSBuildProjectExtensionsPath)$(MSBuildProjectFile).*.props" />
</Project>

并创建 Directory.Build.targets 文件,并将以下内容添加到文件中:

<Project>
  <Import Project="$(MSBuildProjectExtensionsPath)$(MSBuildProjectFile).*.targets" />
</Project>
  • 在项目文件中,在Project节点下添加以下内容:
<ItemGroup>
  <ProjectCapability Include="PackageReferences" />
</ItemGroup>

并且

<PropertyGroup>
  <NuGetTargetMoniker Condition="'$(NuGetTargetMoniker)' == ''">native,Version=v0.0</NuGetTargetMoniker>
</PropertyGroup>

(或类似名称)

  • 重新加载项目。

以上操作将使MSBuild和Package Manager工作,但有一些注意事项,例如在通过UI修改包后需要“全部保存”,包引用不会显示在解决方案资源管理器的引用节点中等。

请注意,Visual C++团队的PM Augustin Popa在此处解释了为什么将项目更新到部分支持的PackageReference可能不是一个好主意,因为他们对未来有其他计划:

我们的担忧是,如果开发人员做了迁移到C++ PackageReference的工作,他们会后来意识到我们不打算提供持续支持,并希望他们转向其他东西。我预计这将是一种令人沮丧的经历。

他所说的“其他东西”可能是与vcpkg更好地集成,正如他在对Visual Studio的功能请求评论中所讨论的那样:

从我们这边来看,我们必须考虑到具有不同要求的非常庞大的用户群体的需求,其中包括对CMake项目的支持,为非Windows平台安装软件包,以及提供一个更好的故事,以获得与它们附加到和相互兼容的可执行文件相容的库(今天使用vcpkg实现)。 NuGet没有设计来处理这些情况[...]

即使是Microsoft内部的开发团队也在使用PackageReference方法,正如此评论中所见:

我们通过此Pull Request在React Native Windows中实现了这一点。

正如已经提到的,MSBuild可以处理C++(VCXPROJ)项目的这种情况。

Visual Studio IDE的一流支持对于想要放弃传统的NuGet.exe / pakcages.config机制但不能承担重写整个项目以适应VCPKG的现有项目将非常有益。

至少,在使用PackageReference时有一个驱动空间的好处,因此不仅仅是外观问题。


1
尽管不受支持,但使用PackageReference与C++项目是可行的。
如果您查看https://developercommunity.visualstudio.com/t/use-packagereference-in-vcxproj/351636的评论,有几个示例说明如何启用此功能。
请注意,Visual Studio的体验可能会下降,但使用MSBuild(命令行)构建没有问题。
请注意,我们目前在ReactNativeWindows的VCXPROJ项目中使用PackageReference。 作为一项不受支持的功能,需要一些黑客技巧才能兼容Visual Studio,但总体上它是有效的。 https://github.com/microsoft/react-native-windows

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