程序包管理器与Git子模块/子树

时间:2018-09-10 11:07:43

标签: git-submodules package-managers git-subtree

是否有任何理由使用软件包管理器而不是git子模块/子树,反之亦然? git解决方案似乎比简单的包管理器麻烦得多。

假设git子模块的节省空间的好处并不重要。

更新:有人为此问题添加了C ++标记,但此后我将其删除。这个问题不专门与C ++有关。欢迎接受比接受的答案更多的一般答案。

2 个答案:

答案 0 :(得分:5)

  

git解决方案似乎比简单的包管理器麻烦得多。

这与麻烦无关。

这是关于构建项目的两种不同方式:

    使用包管理器(NexusConan for C++通过二进制依赖项进行
  1. :声明 依赖项,然后程序包管理器将其获取并在编译期间使用它们。
  2. 通过 source 依赖项以及Git子模块或子树,您可以在其中存储对其他源代码的引用,将其导入,然后重新编译所有内容。

在构建系统时,第一个很好,每个部分都有自己的发布生命周期,并且您希望依赖于预先构建的依赖项。

当依赖项与主程序更紧密地链接时,使用第二个。

或者在没有二进制依赖性的情况下(例如,Goits modules就是这种情况)。

答案 1 :(得分:5)

“如果技术环境允许打包和正式的依赖项管理,那么您绝对应该走这条路。”

上面的内容来自Mastering Git submodules,这是一篇写得很好并且经过深思熟虑的文章,它应该是该问题以及许多类似Stackoverflow问题的最佳答案。

让我引用与此问题相关的部分:

他们是从事这项工作的正确工具吗?

在许多情况下,通常由于使用的技术或框架而要求在容器代码中物理存在模块代码。例如,用于Wordpress,Magento等的主题和插件通常仅通过它们仅存在于项目树中的常规位置而安装,这是“安装”它们的唯一方法。

在这种情况下,与子模块(或子树)一起使用可能是正确的解决方案,前提是您确实需要对该代码进行版本控制并与第三方进行协作(或将其部署在另一台机器上);对于严格的本地无版本情况,符号链接可能就足够了,但这不是本文的目的。

另一方面,如果技术环境允许打包和正式的依赖项管理,则应该绝对走这条路:它可以让您更好地拆分代码库,避免造成子模块空间乱码的副作用和陷阱,并让您受益于诸如依赖项的语义版本控制(版本控制)之类的版本控制方案。