2

我们有一个大型 TFS 安装,有数百名开发人员在 500MB 的源代码上工作。目前,我们正在使用功能驱动的方法进行开发,并为每个功能创建一个新分支。您可以讨论这种方法的合理性,但它会产生以下情况:

开发人员将拥有多个 95% 相同的分支。多个开发人员将拥有相同的分支,甚至是相同的版本。只有生产和集成分支是定期构建的,所以为了做任何有用的事情,每个开发人员都必须构建他们需要的每个分支。构建时间大约需要 1-2 小时来构建所有内容。

我们通过在一夜之间构建所需的分支并在实际开发过程中只构建单个模块来解决这个问题。然而,每个开发人员将多次编译完全相同的程序集,只是在不同的分支中。但有时你需要在工作期间完全建立一个分支。

是否有适用于 TFS/Visual Studio 的“企业就绪”编译器缓存解决方案?我已经将 ccache 与 gcc 一起使用,但我几乎看不到如何将其集成到 .Net 环境中。谷歌搜索这个问题也没有找到太多信息。

4

1 回答 1

2

当解决方案中有许多项目时,构建时间会显着增加。C# 编译器重新分析每个被复制的 dll,因此从某种意义上说,“复制本地”选项是邪恶的。

有关可能的解决方案,请查看Patrick Smacchia这两篇文章

简而言之,构建时间随着项目的数量呈指数增长,因此,您应该尝试通过将所需项目的数量合并在一起来尽量减少它们。项目/程序集通常用于强制架构边界(我也像这样使用它们),但这并不适合大型项目。相反,您可以使用NDepend等工具来验证架构规则,并防止类型之间的循环依赖。您可以通过对命名空间中的类型进行分组并按功能对类型进行分组来做到这一点。

一张纸条。我在我的一个开源项目Simple Injector中通过程序集使用了关于分区代码库的建议。项目不直接引用其他项目,而仅引用程序集。缺点是 Visual Studio Go To Reference 选项 (F12) 不再起作用,因为 VS 不再了解该项目的任何信息。VS 不会跳转到代码,而是会跳转到一个生成的文件,该文件只包含一个类型的 API 定义。在咨询了 Patrick Smacchia 之后,他解释说他从来没有遇到过这种情况,可能是因为他的团队使用了 Resharper,它似乎仍然知道如何跳转到代码。

结论是您需要对此进行试验,并且可能希望为所有开发人员提供一个生产力工具,例如 Resharper,它允许您仍然“跳转到代码”。并且你需要一个像 NDepend(NDepend 很棒)这样的工具,并将它集成到构建过程中,以确保开发人员不会破坏架构规则。

减少编译时间的另一个选择是以核心库团队成为“外部”的方式拆分团队。这些团队可以在那里开发、版本和发布可重用库作为其他团队可以包含在他们的解决方案中的 DLL(并将该特定版本签入源代码控制)。这使这些团队(可能是产品团队)不必编译基础库,并且由于这些 DLL(在解决方案中)放置在一个文件夹中,因此您可以立即获得如 Pattrick 文章中所述的性能提升。这对开发盒和构建服务器的编译时间都有积极影响。

这种方法的缺点是您(再次)不能“跳入”该代码,并且开发核心库的过程将更加严格。这些库成为可重用的框架,您不能轻易更改这些库的公共 API。产品/功能开发人员也不能简单地在核心库中添加/更改代码或修复错误,他们需要等待核心团队发布新版本。但是,以您组织的当前规模(数百名开发人员),您可能已经需要(或拥有)这样的结构。

于 2012-05-31T09:55:56.437 回答