我应该如何管理作为单独的NuGet包部署的项目之间的依赖关系?

时间:2012-06-16 12:47:33

标签: dependencies nuget

我正在使用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的版本,我是否存在潜在的冲突风险?

1 个答案:

答案 0 :(得分:1)

这是我要做的,假设我理解了这个问题......

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

创建其他两个包时,请指定Core(docs.nuget.org

的确切版本号

示例MyUtils.WebApi.Windsor.nuspec:

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

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

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

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

在这种情况下,它表示任何版本的MyUtils.Core&gt; = 1.0.1.1。因此,如果您使用默认语法,则在使用Windsor和Security的项目中存在冲突风险,但您应该能够使用确切的版本语法来避免它。

让我们说你走了另一条路,并没有为Core创建一个包,并使用了项目引用。然后大概你会在每个需要它的包中放入一个Core.dll的副本。好吧,消费项目一次只能引用一个Core.dll副本。我必须使用NuGet来查看它将添加哪个引用(最高版本与最近安装的版本),但最重要的是如果你有重大更改,那么你的一个依赖库会破坏。所以看起来参与项目参考可能不是最好的解决方案。

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