48

我一直致力于为新的一年的 Team Foundation Server 部署标准化源代码控制结构。我首先使用 CodePlex 上提供的Microsoft Team Foundation Server 分支指南文档。

我希望得到一些反馈和对我对拟议结构的一些具体问题的回答。当谈到在 TFS 中构建源代码控制时,我了解到有太多“标准”可供选择,以至于没有真正的标准。

首先,我将概述和描述决策和用法。

$/                                                
    {Team Project}/                               
        {Subproject}/                             
            Development/                          
                Trunk/                            
                    Source/
                    Tests/
                    Sandcastle/
                    TeamBuildTypes/
                        {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/

            Integration/
                Source/
                Tests/
                Sandcastle/
                TeamBuildTypes/
                    {Build Name}/
            Production/
                Releases/
                    {Release Version}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                           {Build Name}/

一般逻辑是团队项目可以包含单个逻辑项目(没有{Subproject}条目)或产品或工具套件形式的多个相关项目。三个主要容器称为DevelopmentIntegrationProduction

Development容器的主干中,文件夹中包含构成产品的两个项目的规定,Source文件夹中提供了相应的单元测试Tests。大多数次要开发将发生在主干中,可以通过Trunk文件夹的同级Branches文件夹进行分支,该文件夹充当分支容器。一个或多个解决方案文件将存在于 中Trunk,允许该级别的分支捕获解决方案、源代码和单元测试。

Integration容器在非 TFS 实现中通常称为“主”,仅用于集成变更集Development以创建稳定且可测试的构建。Development一旦获得可测试的产品,它最初是作为容器的一个分支创建的。此容器的构建将用于我们的测试环境和负载测试环境。我们选择将负载测试包含在可测试的构建中,以便我们可以监控性能变化,能够快速隔离可能导致任何违规行为的变更集。

Production用于生产预生产和生产质量构建。Integration一旦推荐发布稳定版本,它最初是作为容器的一个分支创建的。在Releases文件夹中,遵循“按发布分支”结构,在一个地方提供快照和隔离。(例如,当Release 1.1准备好进行预生产构建时,稳定Integration容器会分支到结构中的新Release 1.1文件夹中Production/Releases。后续的 RC 和 RTW/RTM 也会被提升到此文件夹中。)还存在一个分支结构,如Branches容器中所见。这允许“修补程序”,通常是修订标记(Major.Minor.Revision)。分支是从当前版本创建并合并回新的修订标记 - 比如Release 1.1.1. 变更集将在接受后反向集成到Development容器中Trunk

我们认为这种结构是稳健性和复杂性之间的公平平衡。但是有一些烦人的问题我无法在逻辑上适合该模型。他们是:

团队构建-容器最初将作为夜间构建开始DevelopmentIntegration最终转向持续集成 (CI)。生产容器将手动构建。

  • 构建定义应该放在哪里? 编辑 - 基于几个响应,TeamBuildTypes 文件夹已移动到主干并分支到适当的容器。然而,这确实导致了一个新问题(如下)。

  • 通过将 TeamBuildTypes 文件夹放在相应的容器中,这是否意味着所有构建定义都将在相应的文件夹之间复制?例如,具有开发质量构建以及可测试构建等的构建定义,所有这些都存在于整个结构中的所有 TeamBuildType 文件夹中。

文档生成- 我们使用 Sandcastle 生成文档。具体来说,我们还使用Sandcastle Help File Builder来管理输出。这将生成一个特定于 SFHB 格式的项目文件。

  • 生成的文档是否应该存储在源代码控制结构中?

  • 是否应该为每个容器生成文档,还是只对预生产和生产质量构建有价值?

  • 为了保持快速的本地构建时间,文档创建是否应该由构建定义拥有?

  • 特定于 SHFB 的文件应该放在哪里?我最初的想法是将它作为和文件夹的对等SourceTests 我同意它与Source和同行的建议Tests。图表已更改以反映此更改。

第三方二进制文件

  • 二进制文件(控件、库等)是否应该存储在源代码管理中?

  • 如果是这样,它应该是它自己的团队项目吗?

通用文档- 非生成文档,例如需求、设计文档、测试计划等,不会反映在源代码控制结构中的文件夹中。经过与我的开发人员和同行的一些研究和讨论,使用 Team Explorer 中的内置 Documents 文件夹提供了更多好处,因为它反映了 Team Project Portal 中的结构,并且一些(业务)用户不需要额外的复杂性来学习TFS 的源代码控制方面。


当我得到问题的答案以提供更清晰的画面时,我将更新结构。我也欢迎与潜在变化相关的任何其他评论。如果我有任何其他问题,我会确保修改这篇文章。

编辑:

  • 澄清。 Source并且Tests文件夹也确实存在于Integration容器下。

  • Micah 和 Josh 都提出了关于第三方二进制文件的重要观点。添加了关于该问题的问题。

  • 文档生成可能很慢。添加了有关文档创建是否应归特定团队构建类型所有的问题。

  • 添加了与非生成文档相关的解决方案,例如需求、设计文档、测试计划等。

  • 为构建定义添加了与 TeamBuildTypes 文件夹相关的分辨率。

  • 根据各种反馈,将 TeamBuildTypes 文件夹移至主干/分支级别。

4

5 回答 5

6

我喜欢您将 Sandcastle 文件作为 Source 和 Tests 的对等点的想法,我将添加一个文档文件夹,然后该文件夹将包含 sandcastle 文件,以及可选的实际文档。

意见肯定存在差异,我相信我会因此而被否决(因为我以前曾这样做过)。出于以下几个原因,我会将生成的文档放在 TFS 中:

  1. 每个版本都需要您的文档,使用 TFS 是一种简单的方法,可以确保您的文档保留在正确的位置。
  2. 使用 TFS 存储它意味着每个人都会知道去哪里获取文档。

我没有看到我一直在努力解决的一件事是第三方依赖项的位置,可能是它们属于源代码,因此它们与每个项目都在一起,尽管如果你想在项目之间共享它们,你可以添加一个新的顶部级节点。

编辑

对于我的二进制文件,我通常最终得到

$/第三方/公司/产品/版本/Src(可选)

所以例如我有

$/ThirdParty/Microsoft/EntLib/3.1 4.0 ComponentArt/WebUI/2008.1/Src

我喜欢添加源代码,我不得不修补我讨厌做的 CA 的源代码,但是当第三方没有修复错误时,你必须求助于此。

于 2008-12-19T14:28:02.707 回答
4

很棒的布局和解释。我一直在为完全相同的问题而苦苦挣扎。我最终得到了一个非常相似的结构。我的略有不同。

Development/
   Trunk/
      Binaries/  -- Shared libraries
      Source/
      Test/
      Docs/      -- Documentation
TeamBuildTypes/  -- Build definitions
  • 添加二进制文件夹允许您在分支中有一个位置,您的所有项目都可以引用共享库
  • 我们将文档放在这里,以便它可以与它的特定分支一起移动。
  • 我们的构建定义处于开发级别,因为我们可以将它们放在所有分支的一个位置,但它肯定可以在分支级别,这可能更有意义。

二进制文件(控件、库等)是否应该存储在源代码管理中?如果是这样,它应该是它自己的团队项目吗?

我认为它们绝对应该是源代码控制的,但我认为没有任何理由将它们放入自己的团队项目中。需要注意的一个问题是 TFS 出于某种原因对二进制文件的处理方式略有不同。我在源代码管理中更新了二进制文件时遇到了问题,但在其他机器上“获取最新”不会导致文件更新。有时您需要执行“获取特定版本”并检查该特定文件的“覆盖未更改的文件”选项。

于 2008-12-19T14:12:19.367 回答
3

你应该把你的 TeamBuilds 文件夹放在你的树干下。这在 TFS2005 中是不可能的,但微软在 2008 年修复了它......

这样做的原因是您的构建可能会随着更新的版本而改变(例如:新的打包方案、不同的测试等),这可能使其与旧的维护版本不兼容。这就是为什么您应该将团队构建与代码版本结合起来。

这样,假设您发布了 1.0 版本并将其放在 Releases 文件夹下。在开发主干中使用 v2.0 时,您将能够构建它并发布补丁(这可能需要修改构建)

于 2008-12-27T08:39:55.103 回答
3

对于您的二进制文件 - 显然,唯一应该受版本控制的二进制文件是“第三方”程序集,您不会“构建”作为任何自动构建的一部分。如果您有自己的库,并且它们的源代码受版本控制等 - 您应该查看用于构建和同步等的各种策略。

然后我像 Josh 一样组织它们 - 然后使用分支将二进制文件“复制”到一个 _ExternalReferences 文件夹,该文件夹与解决方案树中的 .NET Project 文件夹是对等的。这是服务器端的一种非常有效的方式,因为 TFS 版本控制只存储“Deltas”——所以基本上这些二进制文件在许多项目中的每个“重复”基本上就像一个“指针”。

于 2008-12-28T17:24:30.690 回答
2

我建议的一件事是不要将默认位置用于团队构建并将其包含在“可分支”级别中,因为当您出于各种原因(例如代码提升)进行分支时,您会希望您的构建脚本被分支并同步它。

此外,刚刚在http://www.codeplex.com/TFSBranchingGuideII上发布了一个新的和更具体的场景指南

于 2008-12-24T10:31:49.340 回答