我目前使用的是一个大型解决方案,包含大约100个项目。至少有10个项目是可执行的应用程序。一些库项目是通过MEF和反射而不是直接引用作为插件导入的。如果所需插件本身的依赖项没有被复制到可执行项目的输出或插件目录中,我们将在运行时得到反射错误。
我们已经尝试或讨论过以下解决方案,但这些解决方案似乎都不合适:
在这种情况下,最佳实践是什么?是否有比上述任何一种更好的解决方案来管理反射依赖项的依赖关系,或者对上面的一项进行细化是最好的选择?
发布于 2013-08-21 15:16:07
好的,在这个答案中,我假设每个开发人员需要在本地不断地拥有所有100个程序集(调试模式)来完成它的工作(开发、编译、冒烟测试、运行自动测试)。
您提到RebuildAll需要很长的时间。通常,这种症状是由太多的程序集+构建过程导致的,而不是合理化的。因此,首先要做的是尝试将100个程序集合并到尽可能少的程序集中,并避免使用Copy Local = true之类的东西。其效果将是一个更快(如10倍)的RebuildAll进程。请记住,程序集是物理制品,它们只对物理事物有用(例如插件、按需加载、测试/应用程序分离……)。我写了一本白皮书,详细介绍了我对这个主题的想法:http://www.ndepend.com/WhiteBooks.aspx。
通过.NET程序集和Visual项目划分代码库(8页)
在白皮书的建议中,一个想法是避免引用项目,而是引用程序集。这样,您就有责任填写项目>右键单击>项目依赖项,这将定义项目>右键单击>项目构建顺序。如果您决定继续处理100个程序集,则定义此设置代表了一种努力,但作为奖励,高级(可执行)项目可以依赖于一个仅由反射使用的库,这将解决您的问题。
你量过按PDB序列点#表示的代码行了吗?我估计,在200 K到300 K的极限范围内,做一个RebuildAll (在白皮书中进行了优化)应该需要5到10秒(在一台像样的笔记本电脑上),而且它仍然可以接受。如果您的代码库非常大,并且超出了这个限制,那么您将需要打破我的第一个假设,找到一种开发人员不需要所有程序集来完成其工作的方法(在这种情况下,我们可以进一步讨论这个问题)。
免责声明:这个答案引用了我创建并管理其开发的工具NDepend站点上的资源。
发布于 2013-08-21 22:02:21
我一直处于像你这样的情况。我们有将近100个项目。我们也在使用MEF和System.AddIn。一开始我们有一些解决办法。我正在研究核心解决方案,其中包括核心程序集及其测试。在一个单独的解决方案中的每个插件类别,包括契约,实现(一些插件有多个实现)和测试,以及一些测试主机以及核心程序集。稍后,我们添加了一个包含所有项目的解决方案,在尝试了您提到的几种方法之后,我们决定执行以下操作:
Copy Local = true设置。虽然建造都很慢,但我们没有任何其他问题。当然,拥有将近100个项目是一个迹象,表明设计可能过于模块化,正如Patrick建议的那样,我们应该尝试压缩它。
无论如何,您可以在几个小时内尝试这种方法,也许可以不设置Copy Local = true,而是尝试将4中提到的所有项目的输出文件夹设置为公共位置。我们不知道这个设置会像Patrick提到的那样减慢构建过程。
PS。我们从未尝试使用NuGet,因为我们没有足够的资源和时间来尝试它。不过看上去很有希望。
发布于 2013-10-04 15:23:46
我们正在启动一个新的项目,我正在寻找这个类似问题的“最佳实践”解决方案。对我们来说,我们可以将项目分为两类:一是平台组件,它提供全面的公共服务集;二是垂直组件,它将执行特定于业务的功能。
在过去,我们使用了Visual插件和一个简单的UI,允许开发人员指定公共程序集路径来复制输出程序集,然后从公共程序集文件夹中引用所有程序集(无论它们驻留在不同的解决方案中)。
我正在看NUGET,但你必须做的纯粹的工作,以创建和维护NUGET包是惩罚性的。
这是一个非常常见的场景,很有兴趣看看其他人是如何解决这个问题的。
https://stackoverflow.com/questions/18345256
复制相似问题