【问题标题】:TFS Project with Multiple Visual Studio Solutions具有多个 Visual Studio 解决方案的 TFS 项目
【发布时间】:2012-06-12 16:54:12
【问题描述】:

我们的团队正在考虑使用 Team Foundation Server v.11 (2012) 来管理我们的项目。我们目前在电子表格中进行项目管理。我们的团队只为内部客户开发软件,项目之间有很多 dll 共享。我们还使用 SVN 进行源代码版本控制。

我们为应用程序的不同部分提供解决方案:公共库、应用程序库(业务规则等)、Intranet 网站、Internet 网站、Windows 窗体。这是我们的 SVN 结构的样子

SVN
    -CommonLibrary (VS Solution)
        -Source
            -CommonLibrary.Core (VS Project)
            -CommonLibrary.Security (VS Project)
            -CommonLibrary.Web (VS Project)
    -OurCompanyLibrary (VS Solution)
        -Libraries (Projects within this solution reference these)
            -CommonLibrary.Core.dll
            -CommonLibrary.Security.dll
        -Source
            -OurCompanyLibrary.Application1 (VS Project)
            -...
            -OurCompanyLibrary.ApplicationN (VS Project)
    -OurCompanyIntranet (VS Solution) (MVC framework)
        -Libraries (Projects within this solution reference these)
            -CommonLibrary.Core.dll
            -CommonLibrary.Security.dll
            -CommonLibrary.Web.dll
            -OurCompanyLibrary.Application1.dll
        -Source
            -OurCompanyIntranet.Application1 (VS Class Library Project)
            -...
            -OurCompanyIntranet.ApplicationN (VS Class Library Project)
            OurCompanyIntranet.UI (VS Web Project)
    -OurCompanyInternet (VS Solution) (MVC framework)
        -Libraries (Projects within this solution reference these)
            -CommonLibrary.Core.dll
            -CommonLibrary.Security.dll
            -CommonLibrary.Web.dll
            -OurCompanyLibrary.Application1.dll
        -Source
            -OurCompanyInternet.Application1 (VS Class Library Project)
            -...
            -OurCompanyInternet.ApplicationN (VS Class Library Project)
            -OurCompanyInternet.UI (VS Web Project)

将代码拆分为多个解决方案的原因是因为我们可以在不同的情况下重用应用程序库(Intranet 应用程序、Internet 应用程序、Winform 应用程序)。此外,Intranet 和 Internet 解决方案包含多个应用程序。这是我们目前的结构。我不确定这是不是最好的组织结构,但它对我们有用。

切换到 TFS 的问题是一个团队项目不能在多个 VS 解决方案中包含部分。例如,我们将为 Application1 设置一个 TFS 团队项目,以便我们可以为该应用程序创建一个产品 backlog。 Application1 需要更改 OurCompanyLibrary、OurCompanyIntranet 和 OurCompanyInternet 才能完成应用程序,但使用 TFS,Application1 将只有一个 VS 解决方案。

以下是我们如何开发应用程序的示例。我们存储在 OurCompanyLibrary VS 解决方案中的所有领域模型和业务规则。当我们开发一个应用程序时,称之为Application1,我们首先开始在OurCompanyLibrary VS Solution下的OurCompanyLibrary.Application1 VS项目中创建领域模型和业务规则。一旦开发了域模型,我们就开始在 OurCompanyIntranet 和 OurCompanyInternet VS Solutions 中对事物的 UI 端进行编程。这些解决方案是一个 MVC 风格的网站。 OurCompanyIntranet 包含一个 VS Web 项目 OurCompanyIntranet.UI,其中包含所有视图(.aspx 文件)、css、javasciprt 等。OurCompanyIntranet 还包含由应用程序分隔的所有模型和控制器(在本例中为 OurCompanyIntranet.Application1)。在 TFS 中组织这成为一个问题,因为我们想要一个用于 Application1 的团队项目,但该应用程序可以跨越多个解决方案,并且我们不希望通过将相同的 OurCompanyIntranet 和 OurCompanyInternet VS 解决方案添加到源代码控制来到处都有重复的代码。

你会如何在 TFS 中组织这个?是否有另一种方式来组织我们的代码结构更有意义?任何能引导我们走向正确方向的文章或网站都会有很大帮助。

【问题讨论】:

    标签: tfs


    【解决方案1】:

    首先,不要使用多个团队项目,这是每个人一开始都会犯的一个巨大错误。对于您的团队规模和您开发的内容:您需要一个团队项目。

    当有两个由完全不同的人组成的团队,以完全不同的方法/流程从事一个完全不同的项目时,您会使用两个团队项目。

    通过一个团队项目,您仍然可以:

    • 拥有许多分支(相关或不相关)。
    • 在您需要的最小级别上管理源代码管理
    • 使用工作项的区域路径(节点树)将您的项目分成子类别(功能、技术、任何您需要的)。这样一来,您就可以拥有一个大的产品待办事项或专门的待办事项。
    • 关于整个项目或特定区域的总体报告(仍在使用区域路径,但在 Reporting Services 中)
    • 相信我,这是最好的方法,许多人(包括我第一次)犯了使用多个团队项目的错误,之后不得不付出代价。您需要的是良好的源代码管理层次结构和良好的区域路径树。

    关于解决方案:

    项目的每个主要组件都有一个解决方案并不是一件坏事,开发人员可以在项目的专用子集上工作,以最大限度地提高生产力并减少组件之间的耦合。

    但您仍然可以拥有一个引用所有项目的全局解决方案,并且在您需要进行影响所有项目的更改时使用该解决方案。拥有全局解决方案也是轻松构建整个项目的简便方法。

    这里的问题是关于跨组件引用,如果您开发的一个组件(例如 Application1)需要您开发的另一个组件(例如 OurCompanyLibrary),那么它会在两者之间创建依赖关系,并且 Application1 必须引用“built OurCompanyLibrary 的程序集”。

    这意味着:

    1. 您必须在源代码管理中的某个位置创建一个位置,以存储将被其他人引用的所有组件的已构建程序集。维护一个构建周期,以按照正确的顺序发布所有内容。

    2. 利用新标准 Nuget 并设置内部 Nuget 服务器(非常容易做到)并为将被其他人引用的组件构建自己的 Nuget 包。

    3. 最简单的方法是将内部开发的所有依赖项包含在解决方案中,以确保在需要时构建它们。这很容易做到,但您的 Application1 项目将包含您的大部分 VS 项目。我没有说这是一个好或坏的方式,这是你的电话。有时简单的方法是最好的。

    每种方式都有其优缺点,只有您才能决定哪种方式最好。

    【讨论】:

    • 您将如何处理程序集版本。我们的策略是每个解决方案都有一个共享的程序集信息文件,因此 OurCompanyLibrary 将具有与 CommonLibrary 不同的版本,依此类推。您现在是否会为整个团队项目只有一个程序集版本?我知道您可以有不同的版本号,但这是最好的方法还是为整个团队项目拥有一个版本号的最佳方法?
    • 如果您的最终产品是单片的,那么所有程序集都可以共享相同的版本号,并且该编号将用于区分您产品的两个不同版本。现在假设您基于相同的组件(公司的核心/业务程序集)开发两个产品(例如两个不相关的网站),程序集版本控制在这里具有不同的含义,因为这两个网站可能使用不同版本的核心/业务程序集您可能对它们三个(核心/业务、站点 1、站点 2)有不同的开发周期。如果一切都是单片的,请不要打扰。
    • 感谢您的建议。它不是单片的。我们有两个不同的面向公众的网站,它们不使用相同的业务程序集,但 Intranet 使用与公共网站相同的业务程序集。我想我会为每个网站和库提供不同的版本。你会如何分支这种事情?我会像平常一样有一个 Main 和 Dev 分支,然后为每个不同的网站创建一个 Release 分支吗?
    • 然后每个组件(业务、网站、内部网)都有自己的分支树(您使用的分支模型取决于您,这是一个全新的故事),也许还有自己的开发周期。考虑使用 1) 或 2) 来解决依赖关系,但如果你一年中有很多版本,我强烈建议你花时间设置 Nuget,这是一个简单、聪明和标准的解决方案,你不会后悔它。
    • 非常感谢您的回答,他们帮助很大。我想多看一下 Nuget 的东西。您是否知道任何有关如何将我们的常用库设置为 Nuget 包的文章?如果没有,我可以做一些搜索。很高兴看到 Nuget 包和部署与构建过程集成。
    【解决方案2】:

    如你所料:-

    OurCompanyLibrary 将是一个 VS 解决方案。

    OurCompanyLibrary.Application1 ... OurCompanyLibrary.ApplicationN 将是该解决方案中的 VS 项目。

    OurCompanyLibrary.ApplicationX.dlls 将是 OurCompanyIntranet 和 OurCompanyInternet VS Solutions 中的引用。

    我不确定我是否理解您的问题。

    OurCompanyLibrary 中的应用程序 VS 项目可以单独构建,生成自己的 dll,然后可以在其他两个解决方案中引用。 如果问题是所有应用程序都在一个 VS 团队项目 (OurCompanyLibrary) 下,那么答案是为每个应用程序创建一个单独的 VS 团队项目 - OurCompanyLibrary1 用于 Application1,OurCompanyLibrary2 用于 Application2 等。 然后,每个应用程序的开发都是完全独立的,并且与其他应用程序分开。

    如果问题是您希望源的不同部分在不同的解决方案中,那么可以通过将项目添加到解决方案来实现。 这确实意味着所有这些解决方案都具有所有源代码。 我们在我工作的地方也有类似的东西:- 我们有一个包含 2 个项目的解决方案 - 我们的通用业务逻辑层和我们的通用数据访问层。 我们的每个其他解决方案都包含这些项目。 这意味着我们可以编辑任何解决方案的源代码。

    我不知道这是否会帮助你,但祝你好运!

    【讨论】:

    • 非常感谢您的回复。我们遇到的问题是一个应用程序(这将是它自己的团队项目)跨越多个 VS 解决方案,并且必须将这些 VS 解决方案添加到每个团队项目中。 OurCompanyIntranet 解决方案为每个应用程序提供一个 VS 项目,并为视图(MVC 风格的网站)提供一个项目。 OurCompanyInternet.UI 项目是一个网站项目,它引用解决方案中的每个应用程序项目(OurCompanyIntranet.Appliation1 ... OurCompanyIntranet.ApplicationN)。我们希望构建我们的解决方案以匹配 TFS。
    • 我编辑了我的原始问题,以添加我们如何开发应用程序的示例。我知道您将来自其他解决方案的项目添加到团队项目的解决方案的来自哪里。我如何在源代码管理中做到这一点,这样我们就不会重复。另外,我们将如何为 Application1 团队项目创建构建,或者我们将如何在 OurCompanyInternet 和 OurCompanyIntranet 团队项目上创建构建?
    【解决方案3】:

    如果这是一个在生产中运行的应用程序,我将对文件夹/解决方案结构进行最小的更改。在构建定义中的 TFS 中,您可以选择多个项目,也可以将多个解决方案放入构建脚本中,如下例所示

    How to build 2 solutions from a single TFS team build definition

    【讨论】:

    • 建筑不是我唯一关心的事情。我还希望能够只拥有一个跨多个解决方案的团队项目,这样我就可以将该项目的所有内容保存在一个地方。
    【解决方案4】:

    如果您想对整个代码库进行集中报告,您应该探索使用 one TeamProject 来托管所有内容的可能性。
    然后区分不同的组件/部分您可以在此 TeamProject 中使用单独的区域。
    查看 this 非常有趣的文章,尤其是优点/缺点部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2018-05-07
      • 2017-07-30
      • 2018-10-02
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多