我需要一个不依赖于特定语言或构建系统的依赖管理器。我研究了几个优秀的工具(Gradle、Bazel、Hunter、Biicode、Conan 等),但没有一个能满足我的要求(见下文)。我还使用了 Git 子模块和 Mercurial Subrepos。
Daniel Pfeifer 在 Meeting C++ 2014 的演讲中很好地描述了我的需求。总结这个依赖工具的目标(在链接视频的 @18:55 讨论):
- 不仅仅是一个包管理器
- 支持预构建或源依赖项
- 可以在本地下载或查找 - 没有不必要的下载
- 使用多种方法获取(即下载或 VCS 克隆等)
- 与系统安装程序集成 - 可以检查是否安装了 lib
- 无需以任何方式调整源代码
- 无需调整构建系统
- 跨平台
我要补充的进一步要求或说明:
- 适用于第三方和/或版本化依赖项,但也能够指定非版本化和/或共同开发的依赖项(可能由 git/mercurial 哈希或标记指定)。
- 提供一种机制来覆盖指定的获取行为以使用我选择的一些替代依赖版本。
- 无需手动设置依赖存储。我不反对将中央依赖位置作为避免冗余或循环依赖的一种方式。但是,我们需要简单地克隆一个 repo 并执行一些顶级构建脚本,该脚本调用依赖管理器并构建所有内容。
- 尽管要求我不必修改我的构建系统,但显然某些顶级构建必须使用依赖管理器,然后将这些依赖提供给各个构建。该要求意味着各个构建不应该知道依赖管理器。例如,如果将 CMake 用于 C++ 包,我应该不需要修改它的 CMakeLists.txt 以使其特殊用于定位依赖项的函数调用。相反,顶级构建管理器应该调用依赖管理器来检索依赖关系,然后提供 CMake 可以以传统方式使用的参数(即 find_package 或 add_subdirectory)。换句话说,我应该始终可以选择手动执行顶级构建和依赖管理器的工作,而单个构建不应该知道其中的区别。
很高兴有:
- 一种事后询问依赖管理器以查找依赖放置位置的方法。这将允许我创建 VCS 挂钩以自动更新共同开发的源代码库依赖项的依赖元数据中的哈希。(就像子模块或子存储库一样)。