Git子模块与依赖管理?

Posted

技术标签:

【中文标题】Git子模块与依赖管理?【英文标题】:Git submodules vs dependency management? 【发布时间】:2018-08-14 23:51:59 【问题描述】:

在我工作的地方,我们使用一个名为 apache Ivy 的工具来进行依赖管理。但是,我最近一直在开发自己的项目,其中包含多个存储库,因此,我使用 git 超级项目来维护所有存储库。 git 子模块对我来说非常棒,到目前为止,我更喜欢它们而不是 Ivy。以下是我喜欢 Ivy 的主要方面:

每当您对两个或多个相互依赖的存储库进行更改时,您只需提交到超级项目,这样就可以清楚地看出什么依赖于什么。在 Ivy 中,您必须发布一个全新的版本,这很烦人。 在超级项目中更好地跟踪更改要容易得多。据我所知,Ivy 不会很好地跟踪您对版本的更改。 Git 的支持比 Ivy 多得多 你只需要了解一种工具,GIT!!!

但是,我的公司拒绝接触 git 子模块/超级项目。我也一直在做一些研究,似乎很多人不喜欢 git 子模块,它不被认为是一个“依赖管理”工具。谁能帮我理解为什么?

【问题讨论】:

Git 的子模块传统上很糟糕,部分原因是在 Git 1.5 和更早的时代,对 in-Git 的支持真的很差。它已经改进了很多,但从那时起我就没有尝试过使用它。看看其他人是否有很好的经验会很有趣。 我最近用过它,但仍然讨厌它。特别是如果超级项目中有多个开发人员和分支。如果您是一个人或与小团体一起,这很好。在任何其他情况下都会变得一团糟...... 您使用哪种语言?编译/解释? 我在家里的项目:java、arduino (c++, c)。工作:主要是python。 我发现这篇 git-project-dependencies 的帖子可能对您的问题有很好的指导作用。 【参考方案1】:

可能像 Apache Ivy 这样的依赖管理器的杀手级特性是传递依赖解决和冲突管理。使用 git 子模块这是不可行的。

来自Apache Ivy features页面:

想象一个经常被软件团队重用的组件,并且该组件具有自己的依赖关系。如果没有一个好的依赖管理工具,每次重用这个组件时,它的所有依赖都必须重复。使用 Apache Ivy,情况有所不同:只需为组件编写一次依赖文件,即可在任何时候重用该组件时从已经完成的工作中受益。

我认为重要的另一个功能是:

下载已经编译好的包,而不必每次都编译

依赖关系报告

总而言之,我只会在你的依赖树真的是并且编译依赖代码很便宜时才建议使用 git 子模块。

【讨论】:

以上是关于Git子模块与依赖管理?的主要内容,如果未能解决你的问题,请参考以下文章

依赖管理

angular与requireJs构建项目

如何使用Git子模块和CMake处理传递依赖冲突?

依赖管理和范围

使用git子模块管理项目

如何将 git 子模块与 Bitbucket 管道一起使用?