Git子模块与Nuget包

时间:2012-09-13 17:46:59

标签: git nuget git-submodules nuget-package

我们的团队已经尝试使用git子模块来实现我们大多数产品共享的一些核心CRUD功能。我们还成功地使用了Nuget软件包(现在自托管)用于一些常见的实用程序。

我们的核心功能经常发生变化,保持子模块正确承诺证明更像是我们期望的苦差事。我正在考虑将核心功能从子模块移动到Nuget软件包,但我想知道对软件包的频繁更新是否会让Nuget更加痛苦。

在对我们的架构和流程进行这种稍微干扰性的更改之前,是否有任何人对我可能遇到的其他挑战有任何经验和指导?

3 个答案:

答案 0 :(得分:3)

与任何事情一样,这取决于。您是否考虑过使用单独的CI软件包存储库,其中每个核心模块的提交都会生成CI软件包?

最大的挑战是包版本化,因为NuGet尚未完全支持SemVer(例如预发布版本+内部版本号)

编辑:nuget.org现在支持SemVer 2.0软件包版本。请参阅此规范:https://github.com/NuGet/Home/wiki/SemVer2-support-for-nuget.org-%28server-side%29

正确使用SemVer。您通常不会预先知道发布的版本号,因此您的CI包版本将从最新的稳定版本继续。这样的CI包将被视为预发布。

例如:2.2.0-CI201209140650(这是在2012-09-14 06:50为即将发布的2.2.0版本进行的CI构建)< - 注意:此版本版本仍然可以更改,但是有总是会成为一条更新路径。

如果采用SemVer v2.0.0,您甚至可以采用以下示例:2.2.0-CI.2012.09.14.06.50

重要提示: nuget.org(以及其他任何其他NuGet服务器/服务,例如MyGet或VSTS)不支持多个包版本仅因构建元数据不同

这对我使用这些约束(以及一些适当的TeamCity构建配置)起作用。 简而言之,这些都是麻烦:

  • 正确的版本控制
  • 提醒选择正确的包源(保持CI pkgs与预发行版和发行版分开,尽管从技术上讲,您的CI包版本是预发布版本)
  • 如果预发布标记的字符串排序高于“CI”(例如“Alpha”),则
  • 从CI pkg升级到预发布可能会出现问题。在这种情况下:uninstall-package“CI”后跟install-package“Alpha”。

希望这有帮助!

答案 1 :(得分:2)

我更喜欢使用子模块而不是 Nuget 包来频繁更改内部库。原因如下:

  • 合并:如果多个开发人员同时对同一个库进行更改,使用子模块,则可以合并这些更改。对于 Nuget 包,显然没有合并的概念。

  • 减少等待:对于子模块,您可以推送,然后使用您需要使用子模块的任何存储库进行拉取。通常需要几秒钟。使用 Nuget,您必须等待包发布,通常是在 CI 流程完成之后。

  • 版本冲突:同样,如果多个开发人员同时进行更改,他们可能会将 Nuget 版本号增加到相同的版本,尽管他们的更改不同。要解决多少痛苦取决于您的 CI 流程。

  • 可以在“客户端”存储库中进行更改:有时,在处理将使用库的客户端代码时,最容易充实库更改的详细信息。对于子模块,这是可能的。当然,这不是测试覆盖率的替代品。

答案 2 :(得分:-3)

我不推荐 git 子模块。我知道现在 git 很流行,但从客观的角度来看,git 太复杂了,不能用于基本用途。官方文档通常不清楚,让人想知道并尝试看看高级功能是如何工作的。高级功能的使用也过于复杂和繁琐。

总的来说,我仍在寻找更好的源代码控制选项。 Git 声名鹊起是本地提交,但在实践中,我已经看到 98% 的时间,它就像传统的源代码控制一样使用,在签入代码时更新远程存储库。更新远程也充当备份,而本地回购则没有。唯一的区别是现在,您必须提交和推送。所以,传统上是一步,现在是两步。这不是进步。

我推荐 NuGet。