3

我正在使用 NuGet 来管理我在几个 WebAPI 项目中使用的共享库,但我不确定如何管理我的共享项目的各个部分之间的依赖关系。

我的共享库配置为包含三个项目的解决方案:

           +------MyUtils.Core------+
           |                        |
MyUtils.WebApi.Windsor    MyUtils.WebApi.Security 

Windsor 和 Security 模块都依赖于 Core,但仍应作为单独的 NuGet 包进行部署。

我的问题是 - 我应该将 Core 作为 NuGet 包单独发布,然后将该包添加到 Windsor 和 Security,还是应该在 Windsor 和 Security 项目中添加对 Core 的项目引用,然后将它们作为单独的项目发布?

如果是后者,如果我正在构建一个同时具有 Windsor 和 Security 的项目,并且我将其中一个升级到包含不同版本的 MyUtils.Core 的版本,我是否会冒潜在冲突的风险?

4

1 回答 1

1

这就是我会做的,假设我理解这个问题......

做3个包。MyUtils.Core 是最简单的,因为它没有依赖项。当您创建 Core 时,它​​将以一种或另一种方式获得一个版本号(您可以使用程序集版本号,或手动分配。)

创建其他两个包时,请指定 Core ( docs.nuget.org )的确切版本号

示例 MyUtils.WebApi.Windsor.nuspec:

<dependency id="MyUtils.Core" version="[1.0.1.1]" />

完成此操作后,您可以更新 Security 以使用下一个版本,例如 1.0.1.2。但是,您将避免在消耗两者的项目中发生冲突。准确指定版本号后,NuGet 将拒绝更新安全性,除非它可以找到同样依赖于 1.0.1.2 的 Windsor 版本。如果找不到兼容的软件包,则不进行更新。如果可以,那么它会在安全更新时同时更新。

默认情况下,版本号是这样指定的,

<dependency id="MyUtils.Core" version="1.0.1.1" />

在这种情况下,它意味着任何版本的 MyUtils.Core >= 1.0.1.1。因此,如果您使用默认语法,则可能会在同时使用 Windsor 和 Security 的项目中发生冲突,但您应该能够使用确切的版本语法来避免这种情况。

假设您选择了另一条路线,没有为 Core 创建包,而是使用了项目引用。然后大概你会在每个需要它的包中放置一个 Core.dll 的副本。好吧,消费项目一次只能引用一份Core.dll。我必须使用 NuGet 来查看它会添加哪个引用(最高版本与最近安装的版本),但最重要的是,如果您有重大更改,那么您的依赖库之一就会中断。因此,似乎获取项目参考可能不是最佳解决方案。

当然,只有在确实需要避免冲突时才需要这样做。如果您的 1.0.1.2 向后兼容,那么没有理由不允许 NuGet 中的默认行为。

于 2012-06-16T15:54:26.550 回答