Visual Studio中大型解决scheme的最佳实践(2008)

我们有大约100多个项目的解决scheme,其中大多数是C#。 当然,开放和build设需要很长时间,所以我正在寻找这样的野兽的最佳实践。 沿着我希望得到答案的问题,是:

  • 你如何最好地处理项目之间的参考
    • 应该“复制本地”打开还是closures?
  • 应该每个项目build立到自己的文件夹,或者他们都build立到相同的输出文件夹(他们都是同一个应用程序的一部分)

  • 解决scheme的文件夹是组织东西的好方法吗?

我知道把解决scheme分解成多个更小的解决scheme是一种select,但是它有自己的一套重构和构build头痛,所以也许我们可以把它保存为一个单独的线程:-)

你可能对我写的这两篇MSBuild文章感兴趣。

MSBuild:创build可靠构build的最佳实践,第1部分

MSBuild:创build可靠构build的最佳实践,第2部分

特别是在第2部分中,有一个部分是build立大型的源代码树 ,你可能想看看。

这里简要回答你的问题:

  • CopyLocal? 一定要把这个关掉
  • build立到一个或多个输出文件夹? build立到一个输出文件夹
  • 解决scheme文件 这是一个品味的问题。

说易卜拉欣Hashimi

我的书: Microsoft Build Engine内部:使用MSBuild和Team Foundation Build

+1为节省解决scheme文件夹使用帮助组织的东西。

+1项目build设到自己的文件夹。 我们最初尝试了一个通用的输出文件夹,这可能导致微妙和痛苦find过时的引用。

FWIW,我们用解决scheme的项目参考,虽然nuget现在可能是一个更好的select,但是发现svn:externals对第三方和(框架types)内部程序集都很好。 只要养成使用特定版本号而不是HEAD引用svn的习惯吧:externals(有罪的就像收费:)

卸载不经常使用的项目,然后购买SSD。 SSD不会缩短编译时间,但Visual Studio的打开/closures/构build速度会快两倍。

我们也有类似的问题,因为我们有109个独立的项目需要处理。 根据我们的经验回答原始问题:

1.你如何最好地处理项目之间的参考

我们使用“添加引用”上下文菜单选项。 如果select了“项目”,则默认情况下依赖项会添加到我们的单个全局解决scheme文件中。

2.“复制本地”应该打开还是closures?

closures我们的经验。 额外的复制只是增加了构build时间。

3.每个项目应该build立到自己的文件夹,还是应该都build立到相同的输出文件夹(他们都是同一个应用程序的一部分)

我们所有的输出都放在一个名为“bin”的文件夹中。 这个想法就是这个文件夹和部署软件时一样。 这有助于防止开发人员设置与部署设置不同时发生的问题。

4.解决scheme文件夹是组织东西的好方法吗?

没有在我们的经验。 一个人的文件夹结构是另一个人的噩梦。 深度嵌套的文件夹只是增加了find任何东西所需的时间。 我们有一个完全平坦的结构,但是将我们的项目文件,程序集和命名空间命名为相同的。


我们构build项目的方式依赖于单个解决scheme文件。 即使项目本身没有改变,build设也需要很长时间。 为了解决这个问题,我们通常会创build另一个“当前工作集”解决scheme文件。 我们正在处理的任何项目都被添加到此。 构build时间大大提高,尽pipe我们已经看到的一个问题是,对于不在当前集合中的项目中定义的types,智能感知失败。

我们解决scheme布局的一个部分例子:

\bin OurStuff.SLN OurStuff.App.Administrator OurStuff.App.Common OurStuff.App.Installer.Database OurStuff.App.MediaPlayer OurStuff.App.Operator OurStuff.App.Service.Gateway OurStuff.App.Service.CollectionStation OurStuff.App.ServiceLocalLauncher OurStuff.App.StackTester OurStuff.Auditing OurStuff.Data OurStuff.Database OurStuff.Database.Constants OurStuff.Database.ObjectModel OurStuff.Device OurStuff.Device.Messaging OurStuff.Diagnostics ... [etc] 

我们在这里工作一个类似的大项目。 解决scheme文件夹已被certificate是组织事物的一个好方法,而且我们倾向于将本地复制设置为true。 每个项目build立到自己的文件夹,然后我们知道在那里的每个可部署的项目,我们有正确的二进制文件的子集。

至于开放时间和时间build设,这将是很难解决,而不会陷入更小的解决scheme。 你可以调查并行化的构build(谷歌“并行MS构build”的方式做到这一点,并整合到用户界面)来提高速度。 另外,看看devise,看看是否重构你的一些项目,以减less整体可能的帮助。

在缓解build筑问题方面,您可以使用“configurationpipe理器…”选项进行构build,以启用或禁用构build特定的项目。 你可以有一个“Project [n] Build”,它可以排除某些项目,并在你定位特定的项目时使用它。

就100多个项目而言,我知道你不想在这个问题上谈论减less你的解决scheme的好处,但是我认为在加快加载时间方面你别无select内存使用)的devenv。

我通常用这种方式取决于“debugging”过程是如何发生的。 通常虽然我不设置复制本地是真实的。 我为每个项目设置构build目录,将所有内容输出到所需的终点。

因此,每次构build后,我有一个与所有的DLL和任何Windows / Web应用程序的填充文件夹,所有项目都在适当的位置。 复制本地是没有必要的,因为DLL结束在正确的地方。

注意

上面的作品适用于我的解决scheme,通常是Web应用程序,我没有遇到过任何与引用有关的问题,但它可能是可能的!

我们有一个类似的问题。 我们用更小的解决scheme解决它。 我们有一个主要的解决scheme,打开一切 但是, 这是不好的。 因此,我们按开发人员types细分小型解决scheme。 所以,数据库开发人员有一个解决scheme,加载他们关心的项目,服务开发人员和UI开发人员同样的事情。 当有人需要打开整个解决scheme来获得他们需要在日常工作中完成的情况时,很less见。 这不是万能的 – 它有好处和坏处。 请参阅本文中的“多解决scheme模型”(忽略有关使用VSS的部分:)

我认为,解决这个问题的最佳实践应该是将其分解开来。 你可以把“解决scheme”看作是将必要的项目和其他方面的东西集合在一起来解决问题的地方。 通过将100多个项目分解为多个解决scheme,专门针对整体问题的一部分开发解决scheme,您可以在特定的时间内通过加快与所需项目的交互并简化问题域来处理更less的问题。

每个解决scheme将产生它负责的输出。 该输出应该具有可以在自动化过程中设置的版本信息。 当输出稳定时,您可以使用最新的内部分布更新相关项目和解决scheme中的参考。 如果您仍然希望进入代码并访问源代码,则可以使用Visual Studio可以使用的Microsoft符号服务器执行此操作,以便您可以引入引用的程序集甚至获取源代码。

同时开发可以通过预先指定接口并在开发时嘲笑开发中的组件来完成,而您正在等待依赖关系不完整但您希望开发的依赖关系。

我觉得这是一个最好的做法,因为当你以这种方式对物质进行分解时,整体努力的复杂程度是没有限制的。 把所有的项目整合到一个解决scheme中,最终会达到一个上限。

希望这个信息有帮助。

我们有大约60多个项目,我们不使用解决scheme文件。 我们有C#和VB.Net项目的混合。 performance总是一个问题。 我们不同时在所有的项目上工作。 每个开发人员根据他们正在处理的项目创build自己的解决scheme文件。 解决scheme文件不会检入我们的源代码pipe理。

所有类库项目都将生成到源目录根目录下的CommonBin文件夹。 可执行文件/ Web项目构build到他们的个人文件夹。

我们不使用项目引用,而是使用CommonBin文件夹中的基于文件的引用。 我写了一个自定义的MSBuild任务,检查项目并确定构build顺序。

我们已经使用了这几年,现在没有任何投诉。

这一切都与您的定义和解决scheme和项目的观点有关。 在我看来,解决scheme就是这样一个解决非常具体要求的逻辑分组。 我们开发一个大的内联网应用程序。 该Intranet中的每个应用程序都有自己的解决scheme,该解决scheme也可能包含exes或windows服务的项目。 然后我们有一个像基类和帮助器和httphandlers / httpmodules的集中框架。 基础框架相当大,被所有的应用程序使用。 通过以这种方式分解许多解决scheme,可以减less解决scheme所需的项目数量,因为其中大多数解决scheme与其他项目无关。

在解决scheme中有许多项目只是糟糕的devise。 解决scheme中应该没有理由拥有这么多项目。 我看到的另一个问题是项目引用,他们最终可能会把你搞砸,特别是如果你想把你的解决scheme分解成更小的。

我的build议是做到这一点,并开发一个集中的框架(如果你愿意的话,你自己实现企业库)。 您可以将其与GAC共享,也可以直接引用文件位置,以便您拥有中央商店。 您也可以对集中式业务对象使用相同的策略。

如果你想直接引用这个DLL,你需要在你的工程中用copy local false(在某些地方像c:\ mycompany \ bin \ mycompany.dll)引用它。 运行时,您需要将一些设置添加到您的app.config或web.config,以使其引用不在GAC或运行库中的文件。 在所有情况下,无论是否是本地复制,或者如果dll最终在bin中,或者甚至在GAC中,都没关系,因为configuration将覆盖这两者。 我认为复制本地的系统是一个糟糕的做法。 如果您需要debugging到其中一个程序集,则很可能必须暂时复制本地。

您可以阅读我的文章,了解如何在不使用GAC的情况下全局使用DLL。 我真的不喜欢GAC,因为它阻止了xcopy的部署,并且不会触发应用程序的自动重启。

http://nbaked.wordpress.com/2010/03/28/gac-alternative/

将CopyLocal设置为false将减less构build时间,但在部署期间会导致不同的问题。

有很多情况下,当你需要复制本地左'真',如顶级项目,二级依赖关系,reflection调用的DLL。

我设置CopyLocal = false的经验不成功。 在我的博客文章“不要改变”复制本地“项目引用为false,除非明白子序列,请参阅赞成和反对的摘要。