.net 如何将一个巨大的解决方案拆分为更小的部分

.net 如何将一个巨大的解决方案拆分为更小的部分,.net,continuous-integration,nuget,.net,Continuous Integration,Nuget,在我的日常工作解决方案中,我们大约有80个项目。此解决方案包含4个不同的网站、业务逻辑和基础结构程序集(例如扩展方法、各种实用程序、存储库基类等) 该解决方案工作得相当好,但是如果我们将测试项目添加到解决方案中,我们很容易通过100多个项目,这使得使用该解决方案非常乏味 在我寻找解决方案的过程中,我对Nuget非常感兴趣,我开始怀疑它是否能帮助我们 其想法是将庞大的解决方案分成更小的原子块,这些原子块的输出将是一个Nuget包,上传到私有Nuget存储库 网站将引用绑定到该特定网站的类库以外的包

在我的日常工作解决方案中,我们大约有80个项目。此解决方案包含4个不同的网站、业务逻辑和基础结构程序集(例如扩展方法、各种实用程序、存储库基类等)

该解决方案工作得相当好,但是如果我们将测试项目添加到解决方案中,我们很容易通过100多个项目,这使得使用该解决方案非常乏味

在我寻找解决方案的过程中,我对Nuget非常感兴趣,我开始怀疑它是否能帮助我们

其想法是将庞大的解决方案分成更小的原子块,这些原子块的输出将是一个Nuget包,上传到私有Nuget存储库

网站将引用绑定到该特定网站的类库以外的包

从CI的角度来看:

每个包解决方案都应该是原子的

  • 它应该能够获取其引用(其他NuGet包,无论是从官方提要还是从私有提要)
  • 建造
  • 运行它的测试
  • 包装
  • 将新包上载到存储库
产品解决方案(如网站)应在以下情况下构建:

  • 提交他们的代码
  • 私有存储库上NuGet包的更新

有什么建议吗?或者是一种更好的方法来实现这个庞大解决方案的拆分?

您可能会将每个单独的网站移动到不同的解决方案。如果您使用的是版本控制工具,这可能是一个合乎逻辑的步骤,因为每个项目都会单独进行版本控制,这意味着开发人员不必同时与所有项目同步。此外,各个网站应该相互独立,所以这不应该是一个麻烦的举动

您是否有与特定“业务项目”不紧密相关的通用或通用代码?此代码可以移动到另一个解决方案,如公司框架或类似的解决方案。然后,每个业务项目都将使用框架的一个发布版本,仅在业务明智的情况下进行升级。例如,如果网站A目前的发布时间表很紧,那么引入包含突破性更改的框架版本可能不是一个好主意。然而,如果网站B处于非关键阶段,您可能希望在有一点空闲时间的情况下,从您的框架中包含新功能,并处理破坏性的更改

我不知道NuGet能否满足您的需求,但提供了一些工具(即鱼眼、坩埚和竹子),可以帮助您以有组织的方式实现类似的目标。注意:我不属于Atlassian。

在这里使用包管理(在Windows:NuGet上)当然是一种可靠的方法。您可以“免费”获得依赖项解析,并且可以利用它,仅通过软件包版本号向软件包使用者传递有意义的信息

但是,NuGet实际上是一些更基本模式的具体实现:

  • 仅生成已更改的代码
  • 将系统分解为可管理的小单元
  • 不要构建“框架”
  • 从您的问题来看,听起来您构建的代码比需要的要多,而且您的代码的模块化程度要低。使用NuGet模块化您的代码将有助于实现这三种模式(当然是1和2-您需要为3采取额外的步骤)

    应用这些模式也会帮助@ FEDE(对于C—C++代码的NuGet来说是不适用的)。通常,通过使您的软件更加模块化(同时避免构建一个整体的、无所不知的“框架”,通常称为*.Library.dll或*.Common.dll等),您将实现以下目标

    最终,每一段代码(VisualStudio术语中的项目或解决方案)都应该是单个开发人员可以理解的;如果它太笨重或复杂,就把它分开。项目、解决方案、.cs文件等都是人类的抽象,而不是机器的抽象,因此它们之间的大小和关系应该反映人类的能力和理解需求。如果做得太远,则需要更改多个包以完成单个功能:在这种情况下,按定义进行的分离是粒度的,您需要再次将一些代码重新组合在一起


    (披露:我是Windows软件包管理的合著者-

    我想知道这种方法的效果如何。我在一个稍微大的规模上面临着类似的问题(包括C++,C,C++和托管C++)的400个项目。我希望这种方法也能帮助减少构建时间成本。你的经历是什么?