管理内部(私有)NuGet包的多个版本

时间:2013-06-18 18:14:01

标签: visual-studio nuget

我们的开发团队规模相当小,到目前为止,所有人都在使用单一的Visual Studio 2012解决方案。我们正在发展,并希望通过针对不同项目团队的多种解决方案创造更好的分离。

但是,有时候一个解决方案中的代码会想要利用另一个解决方案中的代码。我们已经决定使用内部(即私有)NuGet包是管理这些依赖关系的好方法。

但是,关于如何处理处于不同SDLC阶段的相同软件包的多个版本(例如,开发,QA,分期,生产等)的问题已经出现。

示例:如果我们有这三种解决方案......

CoreStuff
CoolProject1
CoolProject2

如果在CoolProject1中工作,我们需要利用CoreStuff中的代码,我们可以添加NuGet包。据推测,这个软件包将是CoreStuff的最新生产版(稳定版)。

但是,如果在CoolProject2上工作的开发人员知道当前处于开发阶段的CoreStuff中的某些更改并希望使用该版本会怎样?

不确定最佳方法是为每个创建单独的包(似乎需要根据解决方案的阶段来回更改包引用)或以某种方式使用同一包的多个版本(不确定是否是使用NuGet轻松管理。

有人解决这样的问题吗?

1 个答案:

答案 0 :(得分:4)

首先要记住的是NuGet不会自动更新你的软件包引用,所以如果你已经将你的解决方案“链接”到最新的CoreStuff稳定软件包(比如1.2.2)那么就不会有任何问题如果提供了更新的(不稳定)版本(假设您正在使用的软件包不会从软件包存储库中消失)。显然,如果你升级你的包参考,那么你将获得不稳定的包。

因此,最简单的解决方案是确保在将其他软件包发布之前通过NuGet软件包管理器将项目“链接”到稳定软件包。虽然UI只允许您获取最新版本,但程序包管理器控制台可以获取任何版本的程序包,因此您可以使用它来明确提供版本号,例如:

Install-Package CoreStuff -Version 1.2.2 -Project CoolProject1

如果这不是解决方案,那么还有其他几种方法可以解决这个问题:

  • 为开发版本提供一个不同的语义版本,表明它是一个不稳定的版本,例如: 1.2.3-α。在这种情况下,CoolProject1可以引入包CoreStuff.1.2.2(它应该是您的存储库中的最新稳定版本),而CoolProject2可以引入CoreStuff.1.2.3-alpha(这将是最新的不稳定版本)。
  • 拥有多个存储库,例如一个用于稳定(已发布)的软件包,另一个用于不稳定(开发)版本。然后,您可以从所需的存储库中选择包。如果您希望这样做,那么只有您的发布过程才能将包推送到稳定的存储库,并且您的CI构建会推送到不稳定的存储库(以便您始终拥有最新的软件包)
  • 如果CoolProject2的开发人员想要针对最新版本进行开发(但是等到发布CoreStuff v.next之后才会发布CoolProject2)那么他可能会创建一个本地软件包存储库(即他的驱动器上的目录)并把新的核心东西放在那里。这样其他开发者甚至都不会看到这个包。

最重要的是确保如果CoreStuff.v-next只有更高的版本号,你就不会在同一个存储库中获得CoreStuff.1.2.2和CoreStuff.v-next,因为在这种情况下NuGet UI不允许您选择v1.2.2(但是包管理器控制台会这样做!)。

如果您想要从一种包类型切换到另一种包类型,则必须进行手动更新(无论如何,在更改为下一个包版本时,您总是必须这样做),但这并不是一件坏事。迫使开发人员至少检查包的更新是否会破坏任何内容。