tfs – 如何避免源代码依赖层次结构导致的嵌套分支

我们正在使用TFS 2010,我们的依赖/分支管理存在一些非常烦人的问题.

乍一看,我们的问题非常普遍.我们有AppServer,WebClient和WinClient. WebClient和WinClient都依赖于AppServer.还有两个限制:

>我们更喜欢包含特定版本的已使用依赖项
>我们更喜欢包含源代码而不是二进制文件,因为它更容易实现和测试来自特定源的AppServer更改,例如WinClient.

我们选择以下文件夹结构:

\
|-AppServer (1)
|-WebClient
    |-Dependencies
        |-AppServer (2)
    |-Sources
|-WinClient
    |-Dependencies
        |-AppServer (3)
    |-Sources

AppServers(2)和(3)是AppServer(1)的分支(作为第一类分支).这一切都很好,符合我们的开发方案.

现在,出现了麻烦.假设我们想在WebClient上实现“每个发布分支”模式,这意味着将整个WebClient层次结构分支到另一个地方.我们不能这样做,因为TFS2010不允许嵌套的第一类分支.

为了增加挑战,我们设想分支层次结构(仅适用于WebClient,我们还有其他几个依赖项和依赖项目)是这样的:

WebClient
    |-Client1
    |    |-feature-1
    |    |-feature-2
    |    |-v1 Release
    |    |   |-v1 hotfix1
    |    |   |-v1 hotfix2
    |    |-v2 Release
    |        |-v1 hotfix1
    |        |-v1 hotfix2
    |
    |-Client2
         |-feature-1
         |-feature-2
         |-v1 Release
         |   |-v1 hotfix1
         |   |-v1 hotfix2
         |-v2 Release
             |-v1 hotfix1
             |-v1 hotfix2

我们有什么选择?我可以想到几个:

>将一流分支转换为文件夹.这将允许我们嵌套分支,但我们将失去跟踪和可视化,我不喜欢.
>我们可以以某种方式重构我们的代码与依赖关系.但我试着想了一段时间,仍然没有看到答案.
>我们可以从代码依赖关系切换到二进制依赖关系,但这会减慢我们的开发速度.

有没有我想念的解决方案?

解决方法

几个想法:

1)您可以将您的AppServer分支与WebClient分开并取消嵌套,只需使用TFS中的工作区映射功能来模拟您通过将AppServer分支到客户端分支中所定义的内容.这将允许开发人员选择他们想要的AppServer分支,并将其嵌套到正确位置的本地文件结构中,以方便他们的工作.

2)你的陈述通过使用二进制文件看起来像我将进一步探索并试图测量和量化的东西来减缓开发.如果您的AppServer和客户端之间有明显的中断,那么我希望它们之间没有依赖关系,而是可以通过svcutil或其他工具生成的一些代理代码.如果是这种情况,并且您在某个过程中托管AppServer并从另一个过程中的客户端进行通信,我不明白为什么您需要实现原始结构.它似乎是不必要的耦合,我想知道它为什么要更详细地完成.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结