我们的团队正在考虑使用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团队项目,以便我们可以为该应用程序提供产品待办事项。 Application1需要更改OurCompanyLibrary,OurCompanyIntranet和OurCompanyInternet来完成应用程序,但是使用TFS,只有一个VS Solution for Application1。
以下是我们开发应用程序的示例。我们存储在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中组织这个问题成为一个问题,因为我们需要一个Team Project for Application1,但该应用程序可以跨越多个解决方案,我们不希望通过向源代码控制添加相同的OurCompanyIntranet和OurCompanyInternet VS解决方案来实现重复的代码。
你会如何在TFS中组织这个?我们应该采用另一种方式来组织更有意义的代码结构吗?任何会引导我们朝着正确方向前进的文章或网站都会有很大帮助。
答案 0 :(得分:44)
首先,不要使用多个团队项目,这是每个人在开始时犯下的一个巨大错误。对于您的团队规模和您开发的内容:您需要一个团队项目。
当有两个完全不同的团队,使用完全不同的方法/流程时,你会使用两个团队项目。
通过一个团队项目,您仍然可以:
关于解决方案:
项目的每个主要组件都有一个解决方案并不是坏事,开发人员可以在项目的专用子集上工作,以最大限度地提高生产力并减少组件之间的耦合。
但您仍然可以拥有一个引用所有项目的全局解决方案,只要您需要进行影响所有项目的更改,就可以使用该解决方案。拥有全球解决方案也是一种轻松构建整个项目的简便方法。
这里的问题是关于跨组件引用,如果您开发的一个组件(例如Application1)需要您开发的另一个组件(例如OurCompanyLibrary),那么它会在两者之间创建依赖关系,而Application1必须引用“内置” OurCompanyLibrary的集会。
这意味着:
您必须在源代码管理中的某个位置创建一个位置,以存储将由其他人引用的所有组件的构建程序集。保持构建周期以释放符合正确顺序的所有内容。
利用Nuget的新标准并设置内部Nuget服务器(非常容易)并为其他人引用的组件构建您自己的Nuget包。 / p>
最简单的方法是在解决方案中包含内部开发的所有依赖项,以确保在需要时构建它们。这很容易,但您的Application1项目将包含大部分VS项目。我不是说这是一个好的或坏的方式,这是你的电话。有时简单的方法是最好的方式。
每种方式都有自己的优点/缺点,只有你能决定最好的方式。
答案 1 :(得分:0)
正如你所预测的那样: -
OurCompanyLibrary将是一个VS解决方案。
OurCompanyLibrary.Application1 ... OurCompanyLibrary.ApplicationN将是该解决方案中的VS Projects。
OurCompanyLibrary.ApplicationX.dlls将是OurCompanyIntranet和OurCompanyInternet VS Solutions中的引用。
我不确定我理解你的问题。
OurCompanyLibrary中的应用程序VS项目可以单独构建,生成自己的dll,然后可以在其他两个解决方案中引用它们。 如果问题是在一个VS团队项目(OurCompanyLibrary)下拥有所有应用程序,那么答案是为每个应用程序创建一个单独的VS团队项目 - Application1的OurCompanyLibrary1,Application2的OurCompanyLibrary2等。 然后,每个应用程序的开发完全独立,并与其他应用程序分开。
如果问题是您想要在不同解决方案中使用源的不同部分,那么可以通过将项目添加到解决方案来实现。 这确实意味着所有这些解决方案都具有所有源代码。 我在工作的地方有类似的东西: - 我们有一个包含2个项目的解决方案 - 我们的公共业务逻辑层和公共数据访问层。 我们的其他每个解决方案都包含这些项目。 这意味着我们可以从任何解决方案编辑源代码。
我不知道这对你有什么帮助,但祝你好运!
答案 2 :(得分:0)
如果这是一个在生产中运行的应用程序,我会对文件夹/解决方案结构进行微小的更改。在构建定义中的TFS中,您可以选择多个项目,也可以在构建脚本中放置多个解决方案,如下例所示
How to build 2 solutions from a single TFS team build definition
答案 3 :(得分:0)
如果您希望对整个代码库进行集中报告,您应该探索使用一个 TeamProject来托管所有内容的可能性。
为了区分不同的组件/你可以在这个TeamProject中使用不同区域的部分。
查看this非常有趣的文章,特别是优点/缺点部分。