我目前正在使用包含大约100个项目的大型解决方案。至少有10个项目是可执行应用程序。一些库项目通过MEF和反射而不是直接引用作为插件导入。如果所需的插件自己的依赖项没有被复制到使用它的可执行项目的输出或插件目录中,我们将在运行时获得反射错误。
我们已经尝试或讨论了以下解决方案,但它们似乎都不合适:
对于这种情况,最佳做法是什么?有没有比上述任何一个更好的解决方案来管理这样的反映依赖关系的依赖关系,还是上述最佳选择之一的改进?
答案 0 :(得分:1)
好的,所以我在这个答案中假设每个开发人员需要在本地持续拥有所有100个程序集(调试模式)来完成它的工作(开发,编译,冒烟测试,运行自动测试)。
你提到RebuildAll需要很长时间。通常,这种症状是由太多的程序集+构建过程未合理化引起的。因此,首先要尝试将100个程序集合并到尽可能少的程序集中,并避免使用Copy Local = true
之类的东西。效果将更快(如10x)RebuildAll进程。请记住,程序集是物理假象,它们仅适用于物理内容(如插件,按需加载,测试/应用程序分离......)。我写了一本白皮书详细介绍了我对这个主题的看法:http://www.ndepend.com/WhiteBooks.aspx
Partitioning code base through .NET assemblies and Visual Studio projects (8 pages)
在白皮书的建议中,其中一个想法是避免引用项目,而是引用程序集。这样你就有责任填写 Project>右键单击>项目依赖项将定义项目>右键单击>项目构建顺序。如果您决定继续处理100个程序集,那么定义此设置代表了一种努力,但作为奖励,高级(可执行)项目可以依赖于仅由反射使用的库,这将解决您的问题。
你衡量Lines of Code in terms of # of PDB sequences points了吗?我估计,直到200K到300K的限制做RebuildAll(在白皮书中描述的优化)应该需要5到10秒(在一台体面的笔记本电脑上),它仍然可以接受。如果你的代码库非常大并且超出了这个限制,那么你需要打破我的第一个假设并找到一种开发人员不需要所有程序集来完成其工作的方法(在这种情况下我们可以进一步讨论这个)
免责声明:此答案引用我创建的工具NDepend网站上的资源,现在管理其开发。
答案 1 :(得分:1)
我一直处在像你这样的境地。我们有近100个项目。我们也在使用MEF
和System.AddIn
。一开始我们有一些解决方案。我正在研究包括核心组件及其测试的核心解决方案。每个插件类别在单独的解决方案中,包括合同,实现(一些插件具有多个实现)和测试,以及一些测试主机以及核心组件。稍后我们添加了一个包含所有项目的解决方案,在尝试了一些您提到的方法后,我们决定执行以下操作:
Copy Local = true
。虽然建设一切都很慢,但我们没有任何其他问题。当然,有近100个项目表明设计可能过于模块化,而且 Patrick 建议,我们应该尝试压缩它。
无论如何,您可以在几个小时内尝试这种方法,也许不是设置Copy Local = true
,而是尝试设置4中提到的所有项目的输出文件夹,将其输出设置为公共位置。我们不知道此设置会降低构建过程的速度,因为 Patrick 会提及。
PS。我们从未尝试使用NuGet
,因为我们没有足够的资源和时间来试验它。虽然看起来很有希望。
答案 2 :(得分:0)
我们正在启动一个新项目,我正在寻找这个类似问题的“最佳实践”解决方案。对我们来说,我们可以将项目分为两类:1)平台组件,它们提供全面的通用服务集合; 2)垂直方案,它们将执行业务特定功能。
过去我们使用了一个带有简单UI的Visual Studio插件,允许开发人员指定一个通用程序集路径来复制输出程序集,然后引用所有程序集(无论它们位于不同的解决方案中)装配文件夹。
我正在寻找NUGET,但你必须做的创建和维护NUGET包的绝对工作是惩罚性的。
这是一种非常常见的情况,并且非常有兴趣了解其他人如何解决它。