我需要一个不依赖于特定语言或构建系统的依赖项管理器。我研究了几种出色的工具(Gradle,Bazel,Hunter,Biicode,Conan等),但没有一个能够满足我的要求(请参见下文)。我还使用了Git子模块和Mercurial子仓库。

Daniel Pfeifer在Meeting C++ 2014上的presentation中很好地描述了我的需求。总结此依赖工具的目标(在链接的视频中@ 18:55讨论):

  • 不仅仅是软件包管理器
  • 支持预构建或源依赖项
  • 可以在本地下载或找到-不需要下载
  • 使用多种方法(例如下载或VCS克隆等)进行提取。
  • 与系统安装程序集成-可以检查是否已安装lib
  • 无需以任何方式修改源代码
  • 无需改编系统
  • 跨平台

  • 我还要添加其他要求或说明:
  • 适用于第三方和/或版本控制的依赖项,但还可以指定非版本化和/或共同开发的依赖项(可能由git/mercurial哈希或标记指定)。
  • 提供一种机制来覆盖指定的获取行为,以使用我选择的某些替代依赖项版本。
  • 无需手动设置依赖项存储。我不反对使用中央依赖性位置来避免冗余或循环依赖性。但是,我们需要克隆仓库和执行一些顶层构建脚本的简单性,这些脚本可以调用依赖关系管理器并构建所有内容。
  • 尽管要求我不必修改构建系统,但显然某些顶级构建必须使用依赖项管理器,然后将这些依赖项提供给各个构建。该要求意味着个人构建不应了解依赖项管理器。例如,如果将CMake用于C++程序包,则无需修改其CMakeLists.txt即可进行特殊的函数调用以查找依赖关系。而是,顶级构建管理器应调用依赖管理器以检索依赖关系,然后提供CMake可以传统方式使用的参数(即find_package或add_subdirectory)。换句话说,我应该始终可以选择手动执行顶级构建和依赖项管理器的工作,而各个构建都不应该知道它们之间的区别。

  • 很高兴有:
  • 一种事后询问依赖关系管理器以查找放置依赖关系的方法。这将允许我创建VCS Hook ,以自动更新共同开发的源 repo 依赖项的依赖项元数据中的哈希。 (就像子模块或subrepos一样)。
  • 最佳答案

    在彻底搜索了可用技术之后,与各种语言(即npm)的程序包管理器进行了比较,甚至在自己的依赖项管理器工具上运行之后,我都选择了Conan。深入探究柯南之后,我发现它可以立即满足我的大多数要求,并且易于扩展。

    在研究柯南之前,我将BitBake视为我所寻找的模型。但是,它仅是Linux,并且非常适合嵌入式Linux发行版。柯南与bb具有基本相同的配方功能,并且是真正的跨平台

    这是我的要求以及在柯南中发现的内容:



    Conan支持经典的发行版或dev依赖关系,还允许您打包源代码。如果注册表(或柯南术语中的“存储库”)中不存在具有特定配置/设置的二进制文件,则会从源代码构建二进制文件。



    科南维护本地注册表作为缓存。因此,碰巧共享依赖项的独立项目无需重做昂贵的下载和构建。

    Conan不会阻止您查找系统软件包而不是声明的依赖项。如果编写要传递给前缀路径的构建脚本,则可以随时更改各个依赖项的路径。



    实现配方的source函数可以完全控制如何获取依赖项。 Conan支持执行源代码下载/克隆的配方,或者可以“快照”源代码,并将其与配方本身打包在一起。



    Conan支持多种生成器,以使依赖关系可以由您选择的构建系统使用。来自特定构建系统的不可知论者是柯南的真正胜利,并且最终是使诸如Bazel,Buckaroo等之类的依赖项管理麻烦的原因。



    考虑到semver构建,但是可以使用任何字符串标识符作为版本。此外,还有userchannel充当软件包版本的 namespace 。



    您可以通过不将特定依赖项包括在install命令中来防止获取特定依赖项。或者,您可以修改或覆盖生成的前缀信息,以指向磁盘上的其他位置。



    科南将依赖项缓存在本地注册表中。这是无缝的。您会在Conan文档中看到的规范模式是在构建脚本中添加一些特定于Conan的调用,但这是可以避免的。再一次,如果您将构建脚本编写到使用者前缀路径和/或输入参数,则可以传递信息而完全不使用Conan。我认为Conan CMake生成器可能需要做一些工作才能使它更加优雅。作为后备,柯南让我编写自己的生成器。



    生成器指向这些位置。借助Python的全部功能,您可以根据自己的喜好自定义内容。

    目前,共同开发依赖项目对我来说是最大的问号。意思是说,我不知道Conan是否可以立即使用某些东西来简化跟踪提交,但是我相信可以添加此自定义功能的钩子(Hook)在那里。

    我在柯南发现的其他内容:

  • Conan提供了下载或构建开发过程中所需的工具链的功能。它使用Python virtualenv使启用/禁用这些自定义环境变得容易,而不会污染我的系统安装。
  • 关于gradle - 语言/平台/与构建无关的依赖性管理器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39044715/

    10-16 17:01