管理单独组件版本之间的依赖关系的最佳方法是什么?

时间:2009-01-29 09:14:24

标签: dependencies

我在我以前的工作中遇到了这个问题,现在再次出现在我现在的问题上,这意味着我要么运气极差,要么不知道某些工具或组织系统可以解决这个问题。

在这两种情况下,最终产品由几个独立的组件组成,每个组件都通过与其邻居商定的接口进行通信。问题是,随着时间的推移,接口将发生变化,然后必须更新相应的组件,以便一切都能继续工作。

这本身不是问题。问题是,当尝试返回SCM历史记录时,这会使错误跟踪变得非常困难,因为在某些时候,您尝试调试的组件将不再与系统的其他部分兼容,并且无法针对它们进行测试没有回滚它们。

采用以下示例:

  1. 假设我们有一个客户端/服务器产品,为了简单起见,两者都以完全工作状态开始。我们将这些版本称为client-1.0和server-1.0。
  2. 经过一段时间后,两者都会出现错误修正和功能。现在我们在客户端1.7和服务器1.2。
  3. 现在接口在服务器中发生了变化,因此客户端也必须更改:server-2.0和client-1.8。
  4. 现在客户端版本为1.9,发现了一个错误,我们想测试以前的版本以查看它停止使用服务器的位置。但是,如果我们回到1.8,那么服务器也必须还原。
  5. 我给出的示例场景非常简化,但问题归结为:强制哪些版本的客户端和服务器彼此兼容的最佳方法是什么?

    我已经考虑过通过文档来做到这一点,但不可避免地,人性会取得胜利,并且有人忘记为他们或其他组件更新它们。我还考虑过通过匹配版本来实现它(即,当服务器命中2.0时,客户端也得到提升),但问题是客户端可能有其他与服务器无关的组件依赖关系,所以它没有意义全面更新他们的版本。

    必须有一些解决方案来解决这个问题。有没有人对我的研究有任何建议或起点?

4 个答案:

答案 0 :(得分:1)

您必须设置历史记录元标签(引用其他标签的标签)

可以这样做:

  • 通过SCM中的元数据(例如SVN会保留其元数据及其数据的历史记录)
  • 或通过外部数据库注册当前测试并验证为“一起工作”的所有标签的列表(前提是该列表也是历史记录)

该元标签的历史性质确保您能够恢复到先前的一组标签以调试系统。

无论您选择哪种解决方案,都不要忘记,一旦在生产环境中交付:

  • 您在该生产环境中没有SCM
  • 因此您必须依赖文本文件来提醒您所部署的确切标签。

构建交付包时,应自动生成该文本文件(将部署到生产中的文件集)

答案 1 :(得分:1)

您似乎没有管理依赖关系的问题,您有一个回归的问题。

接口负责依赖抽象,单元测试和夜间构建负责变更控制。

如果您需要测试历史版本,则需要能够从源存储库中获取该标记版本,并将其部署在复制但非常独立的环境中。因此,这是在SCM中定义发布标签元数据并具有备用/专用硬件的问题。

答案 2 :(得分:1)

我不知道你使用了什么语言平台,即Java,C等。但这里有一些相关的信息让我的生活变得简单。

有一个名为Maven的构建工具,我将其用于Java应用程序。 Maven具有明确的依赖配置。例如

client-1.0依赖于server-1.0 - 当你看到client-1.0配置时你会注意到它需要server-1.0 client-1.7依赖于server-1.2 client-1.8依赖于server-2.0 client-1.9依赖于server-2.0

您发布的每个版本都将在您的maven存储库中提供。如果我想测试client-1.7,我将简单地从存储库和配置中获取它,我知道它需要server-1.2,它也可以在存储库中使用。我将开始我的申请和测试。

答案 3 :(得分:1)

使用RESTful界面。在真正的REST中,客户端将学习如何通过服务器返回的响应中的元数据进行导航。通过保持元数据静态,较旧的客户端可以导航较新的服务器版本。