C++ - 管理外部依赖项

问题描述 投票:0回答:1

我有一个 cmake c++ 应用程序,我将其打包在 docker 中。

我只是使用

apt install
安装一些外部依赖项。
例如
apt install rapidjson-dev
,然后用
包含在 cmake 中
find_package(RapidJSON REQUIRED)

但是我在 GitHub 上看到的一些库没有

apt install
选项。
除了将库源代码复制到我的代码库中之外,管理 C++ 项目中的包的最佳实践是什么? (我不想做的事情)。

同样使用

apt install
对 docker 有好处,但对开发者机器造成了一些污染。 在 Python 中,库是在构建时获取的(使用
pip install
),我还可以使用
virtualenv
在项目之间进行隔离。我正在寻找 c++ 中类似的东西。 我更喜欢一种对于 docker 和非 docker 环境都相同的方法。

c++ cmake package-managers
1个回答
0
投票

首先,C++是一种编程语言,而不是一个开发环境。它根本不关心这类问题。

以下内容并不是真正的答案——但评论还不够大。这是我正在做的一些事情,混合了一些思考过程。

我不知道“最佳实践”;我只是根据手头的库混合各种实践。请允许我给你举几个我当前项目的例子:

外部维护的包:

  • boost:Linux 上安装到系统中,Windows 上安装 nuget 包
  • openssl:安装到 Linux 系统中,Windows 上安装 vcpkg 软件包(仍然不能 100% 工作,可能会改变)
  • protobuf:在 Linux 上安装到系统中,在 Windows 上安装 vcpkg 包

请注意,VisualStudio 更了解开发环境和实际系统之间的区别,因此我不需要将库安装到系统中。

这在 Windows 上工作得还不错,因为我可以找到 VisualStudio 可以使用的包;对于 Linux,实际上有一个自述文件,告诉您需要安装什么——您可能必须适应您正在使用的任何 Linux,因为两个 Linux 永远不会相同。

最大的优点是我不必担心构建东西。对于大型图书馆来说,这通常是一个巨大的混乱,需要遵循许多晦涩的程序,需要祈祷,需要安装更多的工具。所以我绝对想避免这样做。

复制到我的源代码树中(我的存储库中倾向于有一个“Download.sh”,它知道如何下载、解压、编辑以及我想要哪些文件,以便我可以偶尔更新它):

  • 魔法枚举
  • ProtoPuf
  • Boost 示例来源之一

请注意,我复制这些文件是因为这些库很小并且不会发生太大变化;将它们放在我的存储库中可以保证它们永远不会消失。另外,如果需要,我可以在下载过程中对它们进行一些编辑 - 就像 boost 示例一样:虽然它提供了标头,但它实际上已损坏并且无法按给定的方式工作。

这些图书馆不需要建造,即使他们建造了,也可能相当容易,因为它们只是小型图书馆。 “开源”喜欢使事情变得过于复杂,但即使他们使用诸如配置之类的东西,我也可能能够对结果进行硬编码(因为无论如何配置在 Windows 上都不起作用)。

另请注意,将代码复制到我的存储库中意味着无论如何它都不会消失。我实际上可以对其进行一些编辑 - 如果可能的话,我希望避免这样做,因为编辑可能会在未来的版本中失败,但选项就在那里。

Git 模块:

  • 我保存在单独存储库中的其他代码
  • 第三方创建的protobuf“.proto”文件

无论如何,这些几乎是我能想到的唯一方法,并且我在同一个项目中使用所有这些方法。

© www.soinside.com 2019 - 2024. All rights reserved.