使用组件化更快地进行协作和生成
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018
你的产品成功,你的组织正在增长,是时候纵向扩展代码库,以匹配此成功。 在单个产品的单个代码库中横向扩展过去 2-3 个团队时,你可能会发现自己提出如下问题:
我的团队如何有效地共享可重用组件?
如何实现使功能团队无需执行其他团队的工作即可快速循环访问?
如何实现让我的团队能够按照适合他们的速度循环访问?
这些问题不仅适用于新成长的团队。 如果你是一个具有旧代码库的已建立团队,你可能会提出这些相同的问题,因为你被要求提供更多的价值,比以往更快。 无论你的情况如何,组件化都可以帮助你构建一个可扩展到团队大小和当今开发速度的代码库。
在本文中,我们将探讨通过 Azure Artifacts 进行二进制组合如何帮助你管理和共享外部依赖项、开源软件和独立共享组件。
组件和组合
组件化是将产品分离和结构化为一组组件的行为。 大多数 .NET 项目在解决方案中的项目形式中已经具有一些组件的概念。 例如,简单的网站可能具有前端组件、数据访问组件和模型/数据存储组件。
源组件化
随着产品的发展,解决方案和项目模型可能效率低下。 集成需要更长的时间,并且更难合并,生成速度变慢,组件开始从单个项目增长到多个项目。 通常,这是团队开始将这些相关项目集分解为单独的解决方案的点。
一旦超越了单个解决方案,组件化是如何成为一个有趣的问题。 我们从 源合成开始,其中每个组件都通过 Visual Studio 中的项目引用进行引用。 只要源位于单个合成边界中,源组合就可能:单个源存储库中的单个解决方案。
遗憾的是,当涉及多个解决方案时,这些项目引用开始分解。 此时,当解决方案 A 依赖于解决方案 B 时,它必须引用生成的二进制文件 (,即解决方案 B 生成的 DLL) - 这是 二进制组合。
因此,这些二进制文件现在需要生成并提供给解决方案 A,然后才能成功生成。 可通过多种方法实现此目的:
可以将它们签入源代码管理。 根据源代码管理系统,二进制文件可以快速膨胀存储库的大小,减缓签出时间和常规存储库性能。 如果开始在分支中工作,多个团队最终会在不同的版本中引入相同的二进制文件,从而在树根处创建讨厌的合并冲突。
可以在某个位置的文件共享上托管它们。 文件共享有一些限制:快速查找没有索引,并且以后无法覆盖版本。
包组件化
包解决了引用二进制文件的许多难题。 可以让解决方案 B 将其二进制文件作为 NuGet 包生成,而不是将它们签入源中,然后另一个解决方案 A 可以使用。 如果解决方案 A 和解决方案 B 作为单独的组件进行维护,其中 A 和 B 之间的同时更改很少见,则包组合是管理 B 上的 A 依赖项的好方法。包组合允许 B 循环访问自己的节奏,而 A 在 A 计划允许时从 B 获取更新, 它允许多个团队循环访问和更新解决方案 B,而不会影响解决方案 A (或其他解决方案 C 或 D) 。
不过,包组合并非没有挑战。 到目前为止,我们看了一个简单的示例。 但是,将包组合缩放到大型代码库的大小, (Windows 或必应) 等内容可能会导致一系列挑战:
了解依赖项关系图中组件中中断性变更的影响非常具有挑战性。
钻石依赖项 可能会成为敏捷性的重要障碍。
在菱形依赖项中,组件 B 和 C 都依赖于共享组件 A,D 依赖于 B 和 C。组件 A 会发布具有重大更改的新版本。 如果 B 更新,但 C 没有,则 D 无法采用 B 的更新,而不会引入依赖项冲突。 在此简单示例中,与 C 的对话可能是解决冲突所需的所有内容。 然而,在复杂的图中,钻石可以快速变得无法解决。
- 如果必须跨由包组成的两个组件进行更改,则开发内部循环的速度要慢得多。 更新 A 时,必须重新生成、重新打包和重新发布它。 然后,B 必须更新到新发布的版本,以验证 A 的更改。 源组合(可以同时生成 A 和 B)始终为开发人员提供更快的内部循环。
应使用的内容
一般来说,我们看到大型团队在使用组合策略混合时最成功。 为了帮助确定适合代码库的内容,请先绘制产品的依赖项关系图,并开始将组件分组到相关组件集中。
例如,你可能有一组构成框架的组件,包括常见控件等,以及构成面向用户的服务的一组组件。 然后,对于每个相关组件集,请提出以下问题:
我的团队会经常跨已创建的集进行跨签入吗?
单个团队是否负责整个集?
对于单个集,是否有共享发布节奏?
在高级别上,当 源组合 用于单个团队 (处理的相关项目或一组相关团队) 和 二进制组合 用于开源软件、外部 (远离或隔离的团队) 和隔离共享组件时,我们发现最成功。
后续步骤
Azure ArtifactsNuGet 快速入门npm 快速入门 Maven 快速入门 Python 快速入门通用包快速入门快速入门