Visual Studio项目是否应包含在多个解决方案中?

时间:2009-11-01 19:27:01

标签: visual-studio projects-and-solutions

注意:这适用于使用C ++,C ++ / CLI和C#的商店,其中一些产品是作为三者的组合提供的。

我们目前有一条规则,即项目应该只有一个包含解决方案。该规则最初是因为Visual Studio的源代码控制插件无法处理多个解决方案中包含的项目,因此在从一个解决方案更改为另一个解决方案时总是尝试更改源代码控制绑定。

由于其他原因,我们将完全停止使用源代码控制插件(不会丢弃源代码控制,只是停止使用脑干插件)。它重新提出了是否继续将限制项目的政策仅包含在一个解决方案中的问题。

我们在多个可交付产品所使用的库,dll和程序集中有相当多的代码,我们目前通过一个解决方案间依赖关系管理系统来控制它,如果一个人在解决方案中工作-product,请求构建依赖项解决方案是一件简单的事情,它会启动Visual Studio的其他实例来构建它们。该系统有效,但有以下缺点:

  • 常见项目的解决方案通常太胖,包含当前开发的产品所需的一些项目,并且通常还有很多不需要用于手头开发工作的项目。它们只是被归结为一种全面的解决方案,涵盖了仅与松散相关的项目。由于编译了不需要的代码,这会导致构建时间延长。
  • 在我们试图解决上述胖解决方案的地方,我们常常只留下一个只包含一个项目的太瘦的解决方案。这些中的每一个都需要在解决方案间依赖性管理系统中的附加配置。随着Visual Studio的多个实例的旋转,这也会增加构建时间。

我正在考虑修改政策,允许多个可交付产品中使用的项目包含在多个解决方案中。我们可以消除解决方案间依赖关系管理并严重减少解决方案的数量(每个产品减少一个)。我担心这次重组将需要做多少工作以及是否值得付出努力。在团队使用它一段时间之前,我恐怕甚至无法发现潜在的好处。我还预见到一些潜在的问题,这些都是真正的问题。

  • 单个解决方案中的大量项目是否会在Visual Studio 2005(我们当前的开发平台)中出现任何稳定性问题?在VS 2008或VS 2010中它会变得更好吗?
  • 如果项目包含在多个解决方案中,如果项目配置被修改(例如添加新配置),如何管理多个解决方案的效果?

对于已经在每个可交付产品中使用一个解决方案的环境中工作的任何人,将通用组件作为多个解决方案中包含的项目:您是否遇到过此类配置的任何明显缺陷?

6 个答案:

答案 0 :(得分:9)

不,使用尽可能多的解决方案。

例如,我们有一个大型解决方案,可构建约53个项目。它包括一个安装程序和卸载程序,以便它们可以由我们的构建服务器方便地构建,但是如果我想处理这些应用程序,我将它们加载到他们自己的解决方案中(每个项目1个项目),而不是在所有时间加载69个其他不必要的项目它们对其他项目没有任何依赖性,因此这样做完全没有问题(事实上,随着解决方案加载和构建速度更快,它会更高效)

多个解决方案的唯一警告是,在不构建依赖项的任何情况下都必须小心(例如,如果您不构建库,那么您需要注意它是否会在构建库时生成它的源代码会发生变化,因为它将不再为您自动构建)

修改

要回答你问题的最后一部分(因为在你编辑答案时SO会把问题拿走!),VS2005中解决方案的唯一问题是它中的很多项目都很慢。在加载大型解决方案时,VS2008 很多更快,但主要的问题在于解决方案中的项目越多,构建所需的时间就越长(即使它只是跳过不合适的项目)需要建立,需要很长时间)

如果你添加一个新的解决方案配置,那么只需制作一个超级解决方案(或者只保留现有解决方案!),然后对其进行更改,以便一次性应用于所有项目。您仍然需要将新配置添加到您想要使用的任何单独的解决方案中,但如果它们是单项目解决方案,您可以删除它们,加载.csproj并且它将自动重建所有配置它。添加新配置可能不会经常发生。

答案 1 :(得分:4)

在一个解决方案中使用一个项目的主要问题是:

  • 如果您在项目中进行了更改,则可能会在使用该项目的另一个解决方案中导致编译错误。
  • 必须不断更新解决方案以跟上常见项目的变化

在每个解决方案中使用项目的好处是:

  • 如果您可以按照源代码的问题进行调试,则更容易调试。

另一种方法是让每个解决方案都使用他们需要的常见项目的dll。然后,每个解决方案都可以决定何时更改他们使用的版本。

解决方案中的项目数量不是主要问题。但是它会使溶剂的加载和构建变得更慢。我们拥有超过50个项目的解决方案。

答案 2 :(得分:3)

我也在一个环境中工作,该环境中有许多可用于多个可交付成果的常见项目。我们的政策是每个可交付申请的一个解决方案。因此,一个共同的项目可能包含在几个解决方案中这对我们来说效果很好。通用项目虽然包含在单独的解决方案中,但都映射到相同的源代码存储库位置。因此,如果更改了公共代码,则所有包含应用程序都会受到影响(我们的持续集成系统)用于检查其他应用程序是否因公共代码更改而中断。

您在VS解决方案中拥有的项目越多,加载所需的时间就越长,在单个解决方案中管理不同的构建配置和依赖关系听起来很复杂。

答案 3 :(得分:2)

我们有一个包含100多个项目的“主解决方案”。这需要永远加载到VS.2005,直到Microsoft发布了描述here的Intellisense修复程序。

我们的自动“持续集成”构建过程始终构建主解决方案。对于开发,我将“主解决方案”划分为包含相关项目子集的较小解决方案。在添加新项目时,维护此结构需要一些时间,但非常值得。

通过在构建规则中使用$(ProjectDir)而不是$(SolutionDir),可以避免我在多个解决方案中发现的唯一问题,因为后者取决于项目的加载方式。

答案 4 :(得分:2)

Tools for SLN file (Visual Studio Solution file)包含一个工具:

  

可以为SLN文件创建过滤器。它的工作方式是   当打开过滤器文件时,会创建一个临时解决方案   动态。创建的解决方案文件仅包含项目   在过滤器中指定,以及它们的所有依赖项   项目。这使得有可能拥有一个包含的大型解决方案   构建完整系统所需的所有项目,但仍然有   在系统的一个子集上有效工作的可能性。

这消除了维护子集解决方案文件的大部分成本,以提高开发速度。

但是,如果您需要更多项目文件,则需要问自己,因为组合项目文件可以大大加快编译和加载soltuions。

答案 5 :(得分:0)

现在有一个免费的Visual Studio扩展"Funnel",可以通过加载解决方案的预定义子集来解决此问题。该链接适用于VS2012-VS2015;扩展主页上还引用了VS2010版本。

您可以设置多个配置文件(即项目组合)。它们存储在并行的 solution.sln.vsext 文件中,该文件可以提交并与您的团队共享。虽然VS2015在处理大型100多个C / C ++ / C#项目解决方案方面做得更好,但我发现它对于排除每次构建解决方案时构建的makefile项目特别有用。