正确管理解决方案之间的私有nuget包依赖性

时间:2019-05-07 16:07:07

标签: .net-core nuget nuget-package

我们有2个解决方案。

SolutionA是一种内部解决方案,我们在产品中放置了可重用的代码 出于问题的考虑,它只有两个项目NugetProjectANugetProjectBproject reference之间有一个NugetProjectA

SolutionB是一种通过nuget对package references的{​​{1}}的解决方案。

麻烦的是:

  • 添加在SolutionA中添加的新方法
  • NugetProjectA项目中使用先前方法添加新方法
  • 发布NugetProjectB的新版本
  • NugetProjectB的{​​{1}}上更新nuget引用
  • Project新添加的SolutionA方法中执行

由于我们没有发布Project更新版本,因此描述的最后一步将失败。

这似乎是一个容易解决的问题。但请想象一下,NugetProjectB中还有更多项目,NugetProjectA中还有更多项目。

enter image description here

1 个答案:

答案 0 :(得分:0)

您的问题含糊且不限成员名额,因此没有简单明了的答案。老实说,它很容易成为多篇博文系列,甚至是一本简短的书。我将尝试给出一些一般性建议,但为了避免回答太长,我将不做详细介绍。

单仓库与多个仓库

就像几年前的微服务热潮一样,您首先应该问自己是否需要它。将所有源代码都放在一个存储库和解决方案中可能会让您感到“过时”,并且当检查1行内容时,将组件构建3分钟而不是构建整个系统30分钟似乎更好。错误修复。但是,您在问题中列出的问题是否值得通过缩短CI配置来获得好处?

另一个极端是,Google可能将几乎所有内容都运行在单个存储库中,但他们的团队成员除了管理单一仓库和构建系统外,无所不用其极,因为从事单个仓库的大量开发人员都拥有一系列不同的问题。这些工程师不在客户应用程序上工作。如果他们的工作使其他团队更具生产力,那么这是值得的。

您需要找出最适合您的方法,但是鉴于您在问题中描述的问题,也许您有太多的回购/解决方案,并且如果您进行少量合并,您的流程可能会更快,出错更少。

自动化

下一个最好的事情就是仅使用良好的工程实践。尽可能地自动化,以减少人为错误的风险,包括自动化流程以验证手动流程的正确执行。

  • 具有CI或CD管道推送包,因此您不会忘记推送依赖项,就像您的示例一样。
  • 自从签入版本控制配置文件以来,有些工具会根据提交次数自动从git历史记录中生成版本号。这可以防止您在签入对版本的更改时忘记增加软件包版本。包。
  • 进行测试以确保包装在推入之前可以正常使用。您可以像确保依赖项存在一样简单,但是也可以走得更远,并运行使用该软件包的测试程序,以确保向后兼容不会被破坏并且新功能可以按预期运行。在推送软件包之前先运行这些测试,因此,如果测试失败,则不要推送错误的软件包。
  • 您可以拥有一个管道,该管道将在发布其中一个软件包的新版本时自动对使用该软件包的解决方案创建提取请求。您甚至可以自动合并它,但是您需要确保您进行了真正的良好测试,以避免有问题的程序包层叠成一团糟,尤其是如果您在成功的构建中进行自动部署时。
  • 要有创造力,并考虑使流程自动化的其他方法,以使您自己和您的团队更轻松。

但是要对自动化实现实用。花费一个星期的全职时间来自动化某件事是没有意义的,每月只需花费5分钟一次即可进行手动操作。但是,如果手动流程有时会出错并且需要花费数小时或数天的时间进行修复,那么使流程自动化将更值得。

使用现代功能

自宣布.NET Core以来,过去2-3年中.NET生态系统发生了很大变化。现在,使用MSBuild(dotnet packmsbuild -t:pack)打包比创建.nuspec文件更容易创建软件包,并确保您做正确的事情来将项目依赖项打包为nuget依赖项,并获得所有文件放置在正确的位置,等等。如果您的类库使用SDK样式的项目,则无需执行其他任何操作。如果您的项目是传统项目,则需要对NuGet依赖项使用PackageReference(或在项目文件中将<ProjectStyle>PackageReference</ProjectStyle>指定为MSBuild属性),然后引用NuGet.Build.Tasks.Pack包。

版本化应用程序,而不是每个软件包

就像单仓库还是多个仓库一样,请考虑使用单个版本号对应用程序中的所有软件包进行版本控制,而不是分别对每个软件包进行版本控制。是的,这意味着您有时(或可能经常)发布一个软件包的新版本,该软件包的旧版本没有任何代码更改,但是极大地简化了发行版。结合以上部分中的MSBuild打包功能,您可以在系统信息库根目录中创建一个Directory.Build.props文件,并将<Version>属性设置为您的应用版本,并且该存储库中的所有项目都将具有相同的版本。因此,当您准备发布时,将版本捆绑在一个文件中,每个项目和每个NuGet软件包都将具有相同的版本。

摘要

在理想情况下,每个组件都可以在单独的源代码存储库中的不同应用程序中重用,每个包都使用语义版本控制进行单独版本控制。但是在现实世界中,这增加了很多开发时间的复杂性。您的客户可能会更乐于更快地获得错误修复和新功能,即使软件包的版本号意义不大。因此,做出以数据为依据的决策。如果您经常遇到依赖性版本问题,请减少依赖性,以减少出错的地方。

不要误会我的意思,有很多充分的理由来拥有多个项目,多个解决方案和多个存储库。只需确定您这样做的原因是因为它可以帮助您的团队/公司提高生产力,而不是出于理想主义的原因(这会减慢您的速度或导致错误)。