如何在多配置项目中管理第三方库

Dik*_*rAz 8 c++ version-control

假设您正在开发一些支持多种配置的项目(Linux和Windows构建,共享/静态链接,某些功能或没有,等等).要构建所有这些配置,您需要不同版本的第三方组件(使用gcc或msvc构建,共享/静态,具有一些指定的预处理器定义等).因此,最终您最终会遇到管理所有这些配置的问题,不仅适用于您的项目,还适用于您的项目正在使用的所有库.

是否有通用的解决方案/方法/软件来帮助管理单个项目的几种不同配置?

标准:

  • 易于设置,即从头开始构建项目需要花费多少时间?
  • 易于管理,即难以添加新依赖项或删除现有依赖项?
  • 错误证明,即开发人员通过更改依赖关系来打破构建的频率?

到目前为止,我已经尝试了几种方法.

  1. 在VCS下为每个配置存储预构建的软件包.

    优点:项目很小时易于设置(更新工作副本,你很高兴).易于管理(为每个必需的配置构建一次库).错误证明(VCS客户端会通知您有关工作副本的更改).

    缺点:不适用于分布式VCS(GIT,Mercurial等).存储库迅速增长,最终简单的"克隆"操作将无法容忍.您最终还会下载许多您并不真正需要的东西(例如,如果您正在使用Linux,那么就是Windows库).如果您正在实施库,那么您的库的用户将通过将其集成到他们的项目中来继承所有这些问题.

  2. 存储库源而不是预构建的包.

    优点:易于设置.

    缺点:添加新库非常痛苦.您需要为每个配置提供构建脚本和源补丁.但这只是冰山一角.你的依赖项有它们自己的依赖项,它们有自己的依赖项等等......你很有可能最终得到类似Gentoo发行版的东西:)

  3. 在外部服务器上的某处存储存档或仅包含预构建软件包的文件夹.

    优点:解决问题......有点儿.

    缺点:设置起来不那么容易(您必须手动复制存档).不太容易管理(您必须手动将每个库添加到服务器).没有变化的历史.不是错误证明,因为很容易忘记在服务器上放东西,或删除有用的东西.

    稍微改进的方法:您可以使用集中式VCS(例如,SVN)来存储所有第三方库,它将更容易使用.但是,如果将其用作简单的文件存储,您或者没有集中的更改历史记录,或者如果将其用作子存储库,则会获得包含大量不必要库的大型存储库.

Laz*_*ger 2

当您面临此类问题时,您必须学习并开始使用配置管理工具(除了您选择的 SCM 的常用技术之外)。CM 是一个过程,使用一些配置管理工具是这个过程的一部分。

目前,我们有多种不同的 CM 工具可供选择,您可以在其中选择最适合的或只是首选。从我的角度来看,厨师是“每个人的最佳选择”,你的里程可能会有所不同