【问题标题】:How should intermediate library dependencies be handled in c++?在 c++ 中应该如何处理中间库依赖关系?
【发布时间】:2021-11-25 04:44:14
【问题描述】:

我正在构建一个 c++ 存储库,它依赖于支持此存储库的外部公司存储库。我必须构建这些以针对特定于我的系统的某些版本的 boost 和其他库。在(长)构建过程结束时,我有几个静态库和完成的可执行文件。我使用 Docker 进行这些构建。

我正在尝试确定管理这些依赖项的最简洁方法。

  • git 子模块和每次从源代码构建二进制文件(最长构建)
  • 单独构建库并将它们存储为每个存储库的工件/版本(大部分工作,跨多个存储库)
  • 编写一份关于如何重建二进制文件并将其提交到主仓库的自述文件(由于某种原因感觉很脏)

c++ 中处理这些中间二进制文件的常见做法是什么?

【问题讨论】:

  • 绝对不是第三个!一个好的 DevOps CI 流程可以自动执行类似的步骤。第二个目标是一个很好的目标,因为它可以最大限度地保持项目的独立性。但是,设置工作量很大。如果那是最终目标,您应该找到一条渐进的路径来达到目标​​,而不是依赖于在您的项目可用之前设置的所有脚手架......
  • ...第一个是一个很好的起点,甚至可能是终点。通过使用 Docker 的层缓存,您应该能够避免长时间的重建。它应该在你的工作站上开箱即用,如果你在那里启用它,你甚至可以保持你的 CI 过程快速。不过,我可能会远离子模块。他们有点笨拙。你看过子树吗?子树是子模块的一个很好的替代品。
  • 你已经用git 交叉标记了这个,所以我在这里要提一下,在 Git 中存储 any 二进制文件通常是不明智的,而且存储几乎总是不明智的Git 中的任何构建产品/工件:Git 用于存储人工操作的源代码。
  • 使用 ccache 选项 1 重建应该真的快速运行。

标签: c++ git docker


【解决方案1】:

可能无法给出一个普遍有效的答案。您必须考虑您的代码的用户(我是指编译它的人)是谁以及他们的工作流程是什么。

我个人越来越倾向于您列表中的选项三——是的,README 文件。原因是在许多情况下,用户根本不需要(也不应该)为依赖而烦恼。通常会有更高级别的构建过程,以确保所有依赖项都按照应用程序的预期正确准备(下载、可选修补、编译和安装)。使用 Docker,我感觉这正在成为常态。我总是提供一个 Dockerfile(有时甚至是一个完整的 Docker 映像),其中所有依赖项都已就位,用户无需考虑这些就可以编译。

如果不是 Docker,可能还有其他更高级别的构建过程来处理依赖关系。由于我在嵌入式行业,我们主要使用 Yocto,但也有其他的。用户甚至不需要自己使用 Yocto,因为我为他们提供了一个包含所有依赖项的 SDK。

对于那些拒绝使用所有这些选项并坚持在他们的主机上进行本地编译的极少数人,我在 README 文件中写了一个依赖项列表,每行有几行,描述如何获取、编译和安装它们。

至于你提到的其他两个选项:

  • 选项一(git 子模块) - 我必须说我从来没有真正适应过它。 IMO 它们在 git 中的实现有点糟糕(例如,要准确找出每个子模块当前签出的版本真的很麻烦)。此外,使用更高级别的构建过程,这可能意味着双重获取每个依赖项,这是低效的。如果必须的话,很难对依赖项应用补丁。您必须编写一些额外的脚本并将其包含在您的构建过程中。最后,您的依赖项可能本身就有依赖项,然后变得非常丑陋。
  • 选项二(将二进制工件存储在 repo 中)是一个绝对紧急的解决方案,我总是会尽量避免。

因为有人提到了 git 子树——我们在团队中尝试了大约半年。这绝对是一场灾难。没有人真正理解它,大约每周一次有人搞砸了整个存储库。我再也不会使用它了。

【讨论】:

  • “要准确找出每个子模块当前签出的版本真的很麻烦”。 . .嗯? git -C submodule describe 很难吗?
  • 好吧,如果您一开始没有克隆 repo,只是在一些 Web 界面(github、bitbucket 等)上查看它会怎样?或者,如果您想知道过去的特定提交,当时使用了哪些版本的子模块?我对多存储库工具的期望是,只有一个文件列出了各自版本中的所有依赖项。并且该文件应该像普通代码一样进行版本控制,因此我可以轻松查看和比较它。例如,git-repo 工具在这方面做得更好(尽管它还有许多其他麻烦)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2018-12-02
  • 2021-09-03
相关资源
最近更新 更多