nuget 包的开发和分发阶段的最佳配置

发布时间:2021-03-07 07:24

我想制作一组用 C# 编写的 NuGet 包。

这些包是类库,以如下方式相互引用:

  • MyGreatPackage.Core - 无参考
  • MyGreatPackage.Feature1 - 引用核心
  • MyGreatPackage.Feature2 - 也引用了核心
  • MyGreatPackage.Feature2.SubFeature1 - 分别引用 Feature2 包和核心

在开发阶段,经常缺少真实世界的用例,所以我决定将这些包作为真实项目的一部分来开发。 为了实现它,我将这些包提取为 git 子模块并将它们连接到主应用程序的存储库。

因此,有一个这样的 .net 解决方案:

  • MyApp.sln
  • MyApp.Host.csproj
  • MyApp.ClassLibrary1.csproj - 引用 MyGreatPackage.Core.csproj
  • MyGreatPackage.Core.csproj - 在子模块中
  • MyGreatPackage.Feature1.csproj - 在子模块中,引用 MyGreatPackage.Core.csproj
  • MyGreatPackage.Feature2.csproj(引用核心 csproj)
  • MyGreatPackage.Feature1.SubFeature1.csproj(引用 feature1 csproj)

这里一切都很顺利,因为我可以开发应用程序和软件包。

但是,在分发阶段,这种配置似乎不起作用,因为我不能简单地将子模块内容推送到 NuGet 并将子模块引用替换为 NuGet 引用。

问题是 Feature1 包在准备推送到 NuGet 时,应该引用 MyGreatPackage.Core 包,而不是引用 csproj。此外,Feature2 包和 subfeature1 包。

那么我应该如何为开发和分发阶段准备这个设置?

回答1

对于你的问题,我不知道一个简单的答案。但这里有一些可能性:

  • 使用某种工具可以轻松地在项目引用(用于本地工作、能够轻松调试代码等)和 NuGet 引用(用于发布应用程序)之间切换。 RicoSuter/DNT 有一个 switch-to-projects 命令可以做到这一点。

  • 始终使用 NuGet 包引用,并在需要时发布新版本:本地或私有 NuGet 源。您可以使用 SourceLink 等工具调试 NuGet 包,或准时包含项目。根据您的项目的紧密耦合程度以及您所处的开发阶段,此选项可能或多或少可行。

  • 当使用第二种方法时,可以替代第一种方法:使用 git stash 将这些项目包含在解决方案中,并将 NuGet 引用替换为项目引用。如果您自己工作,这可以是偶尔更改项目引用和调试某些内容的选项。如果经常使用,由于那些更改被意外提交等,这可能会很痛苦。