当解决方案中有许多项目时,构建时间会显着增加。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。产品/功能开发人员也不能简单地在核心库中添加/更改代码或修复错误,他们需要等待核心团队发布新版本。但是,以您组织的当前规模(数百名开发人员),您可能已经需要(或拥有)这样的结构。