【问题标题】:Package Management for C++C++ 的包管理
【发布时间】:2023-03-14 18:10:01
【问题描述】:

我在一家公司工作,他们构建了一个项目,该项目由不同的开发团队分别开发的组件分开。 C++ 中的一切。

他们使用许多共同的库并管理所有库,他们创建了一个工具来以某种方式关联项目的版本和库的版本。

问题是市场上是否存在一些已经做到这一点的工具:

我的意思是,如果我使用这个工具,我可以下载例如我们项目的 4.0 版本,它恰好具有库 1 的 4.5 版本和库 2 的 3.4 版本。如果我点击“下载”,我将下载这个整个(项目+库)项目的源代码(或二进制)以及每个库的具体版本。

例如,如果我想下载公司其他开发人员的另一个项目,使用不同版本或平台的相同库,我只需要选择它,然后将下载项目 2 库 1 版本 5.0 和库 2 2.5 ,等等。

市场上是否有任何工具可以让我大声创建类似的关系,顺便说一句,与代码仓库(在我们的案例中为 gitlab)连接?

我检查了 Gradle、Conan ......但他们构建,而不是管理组件之间的“关系”。

类似的东西:

【问题讨论】:

  • 你检查 build2 了吗?
  • Linux 包管理器已经完成了这一切。它们会自动分析每个可执行文件的共享库依赖关系;并假设依赖的共享库已正确版本化,它们将在安装时强制执行依赖关系。简短的回答:将您的应用程序转换为 Linux。如果它们已经在 Linux 上,请修复您的共享库版本(那么它们必须被破坏)并让 Linux 的包管理器完成他们的工作。
  • 一切都在 Windows 中完成,使用 VS2010 和可视化编译器。没有选择更改工具和平台进行开发。遗憾的是,这根本不可能,因为我们稍后还会使用其他工具为实时系统进行编译。
  • Gradle 绝对管理特定的依赖版本!我一直在使用它!
  • 柯南还管理特定的依赖版本。

标签: c++ package-managers


【解决方案1】:

cget 提供了一种安装依赖项的方法,只需指向 github 和 gitlab 等托管服务提供的源 tarball。您还可以提供requirements.txt 以传递安装所有依赖项。

它是基于 cmake 的,只需很少改动即可安装,但它也支持其他 non-cmake packages。您还可以创建 recipes 的发行版,用于处理不遵循标准配置、构建和安装工作流程的软件包。很多 C++ 项目已经有很多可用的配方here

【讨论】:

    【解决方案2】:

    要跟进@norman-b-lancaster 的回答,请考虑查看Hunter package manager。它基于 CMake 的 ExternalProject 功能,并着重于可重现的构建。每个 Hunter 版本都提供了锁定所有依赖项的包版本所需的 CMake 脚本。

    您的问题表明您关心公司内部的包管理(而不是来自例如 GitHub 的公开可用包)。 Hunter 的维护人员知道this issue,如果有需求,他们似乎愿意支持它。

    【讨论】:

      【解决方案3】:

      CMake 提供了足够的功能来在您的构建系统中创建这些类型的关系。不幸的是,您必须使用 CMake 来管理所有项目的构建,才能正常工作。 CMake 确实针对 Visual Studio 以及 GCC、Clang 和 ICC。如果您对此感兴趣,请继续阅读。

      1. 使用CMake 为您的依赖项目构建构建配置。
      2. 使用ExternalProject命令表达父项目的依赖关系。
        • ExternalProject 支持 Git 以及 Mecurial、CSV、SVN 和直接 tarball 下载。
        • 您可以在 Git 中指定确切的提交、标记或分支。
        • 支持通过 SSL 或基本 HTTP 进行 Git 身份验证。
      3. 针对父项目运行 CMake。所有依赖项都会自动下载和编译。

      示例依赖关系

      ExternalProject_Add(
          Library1
          GIT_REPOSITORY https://git@gitlab.yourdomain.com/repo/library_1.git
          GIT_TAG tag_S.33.91
          HTTP_USERNAME ciserv
          HTTP_PASSWORD Obfusc@t3M3
          CMAKE_ARGS
              -DBUILD_EXAMPLES:BOOL=OFF
              -DBUILD_TESTS:BOOL=OFF
              -DBUILD_DOCS:BOOL=OFF
      )
      target_link_libraries(MyTarget PRIVATE Library1)
      

      ExternalProject 模块中还有几个其他命令可用于根据需要进一步自定义依赖项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 2013-07-15
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 2013-07-02
        相关资源
        最近更新 更多