2016-07-29 34 views
8

我在一家公司工作,他们在不同的开发团队分别开发的组件中建立一个项目。一切都在C++中。C++的包管理

他们使用了很多库的共同点,来管理所有的人,他们创造了一个工具,以某种方式涉及的项目和库的版本的版本。

的问题是关于在市场上的一些工具,它已经这样做了的存在:

我的意思是,如果我去这个工具,我可以下载,例如具有完全相同的是,我们的项目的4.0版本版本4.5的库1和库2的3.4版本。如果我点击“下载”,我将下载此整个(项目+库)项目的源代码(或二进制文件)以及每个库的具体版本。

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

在市场上是否有任何工具,大声我创造这样的一些关系,顺便说一句,与代码回购(在我们的例子gitlab)连接?

我检查摇篮,柯南,...但他们建立,无法管理组件之间的“关系”。

类似的东西:

enter image description here

+0

你检查了build2吗? – Dutow

+0

Linux软件包管理器已经完成了所有这些。他们将自动分析每个可执行文件的共享库依赖关系;并假定相关的共享库已正确版本化,他们将在安装时强制执行依赖关系。简短的回答:将您的应用程序转换为Linux。如果他们已经在Linux上,修复你的共享库版本(然后它们必须被破坏),并让Linux的软件包管理者完成他们的工作。 –

+0

一切都在Windows中完成,使用VS2010和可视编译器。没有办法改变开发工具和平台。可悲的是,这是不可能的,因为我们以后也会使用其他工具来编译实时系统。 –

回答

5

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

  1. 使用CMake为您的相关项目构建构建配置。
  2. 使用ExternalProject命令来表示父项目的依赖关系。
    • ExternalProject支持的Git以及Mecurial,CSV,SVN,并直接压缩包下载。
    • 您可以在Git中指定确切的提交,标记或分支。
    • 支持通过SSL或基本HTTP进行Git认证。
  3. 运行cmake对父项目。所有依赖关系都会自动下载并编译。

实施例依赖

ExternalProject_Add(
    Library1 
    GIT_REPOSITORY https://[email protected]/repo/library_1.git 
    GIT_TAG tag_S.33.91 
    HTTP_USERNAME ciserv 
    HTTP_PASSWORD [email protected] 
    CMAKE_ARGS 
     -DBUILD_EXAMPLES:BOOL=OFF 
     -DBUILD_TESTS:BOOL=OFF 
     -DBUILD_DOCS:BOOL=OFF 
) 
target_link_libraries(MyTarget PRIVATE Library1) 

存在可以被用来进一步定制,如果需要的依赖性ExternalProject模块内的若干其他命令。

3

跟进@诺曼-B-兰开斯特的答案,就可以考虑使用Hunter package manager。它基于CMake的ExternalProject功能,并且重点关注可重复的构建。每个Hunter版本都提供了锁定所有依赖包的版本所需的CMake脚本。

你的问题表明你关心你公司的包管理(而不是公开可用的包:GitHub)。亨特的维护人员知道this issue,并且如果需求存在,他似乎愿意支持它。

0

cget,它提供了一种方法来安装依赖关系,只需指向源代码tarball,其中托管服务,如github和gitlab提供。您还可以提供一个requirements.txt来同时安装所有依赖关系。

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