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

dpr*_*ero 1 visual-studio nuget

我们的开发团队一直很小,直到现在,都在开发一个 Visual Studio 2012 解决方案。我们正在成长,并希望通过为不同的项目团队提供多种解决方案来更好地分离。

但是,在某些情况下,一种解决方案中的代码需要使用另一种解决方案中的代码。我们已经决定使用内部(即私有)NuGet 包将是管理这些依赖项的好方法。

但是,问题是如何处理处于不同 SDLC 阶段(例如开发、QA、暂存、生产等)的同一包的多个版本?

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

CoreStuff
CoolProject1
CoolProject2
Run Code Online (Sandbox Code Playgroud)

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

但是,如果在 CoolProject2 上工作的开发人员知道 CoreStuff 当前正在开发中的一些更改并希望使用该版本怎么办?

不确定最好的方法是为每个包创建单独的包(似乎需要根据解决方案所处的阶段来回更改包引用)还是以某种方式利用同一包的多个版本(不确定这是否易于管理)与 NuGet)。

有人处理这样的事情吗?

Pet*_*rik 5

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

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

Install-Package CoreStuff -Version 1.2.2 -Project CoolProject1
Run Code Online (Sandbox Code Playgroud)

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

  • 给开发版本一个不同的语义版本,表明它是一个不稳定的版本,例如 1.2.3-alpha。在这种情况下,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(但包管理器控制台可以!)。

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