nuget 没有使用 nuget 包中为 Microsoft.Extensions.Logging 指定的内容解决依赖关系

Posted

技术标签:

【中文标题】nuget 没有使用 nuget 包中为 Microsoft.Extensions.Logging 指定的内容解决依赖关系【英文标题】:nuget not resolving dependency using what specified in nuget package for Microsoft.Extensions.Logging 【发布时间】:2020-03-15 22:29:26 【问题描述】:

背景:

我已经为 .net core 创建了一个类库(目标 v2.2),我也有一个 .net core 应用程序(目标 v2.2)。

我正在尝试将库导出为 nuget 包并将其安装在我的应用程序中。 这是我的库的依赖项

我可以将它导出为 nuget 包,现在我将它存储在本地 nuget 存储库中。 但是当我尝试在我的应用程序中安装这个库包时,由于Microsoft.Extensions.Logging 的包版本冲突,它没有被安装。这是包管理器控制台输出。

问题:

我已经为Microsoft.Extensions.Logging 指定了确切的版本,即[2.2.0],因为我们可以在屏幕截图中确认我的库的依赖关系,那么为什么它会被解析为版本3.0.0? 我该如何解决这个问题?

环境详情:

使用的 NuGet 产品(包管理器控制台):包管理器控制台主机版本5.3.1.6268 VS 版本(如果适用):Microsoft Visual Studio Community 2019 版本16.3.8 操作系统版本(即win10 v1607 (14393.321)):Windows 10 企业版:1809

【问题讨论】:

我已经创建了一个包,就像你所做的那样,然后将它安装在初始的 net core 2.2 应用程序中,发现没有任何问题。我猜你已经安装了其他依赖于Microsoft.Extensions.Logging 3.0的nuget包。请检查一下。此外,如果可能,请分享 nuspec 文件(如果使用)、csproj 文件或其他 nuget 包(如果使用)。 我认为,如果您之前安装了具有不同内容的软件包,则需要在安装该软件包之前清理 nuget 缓存!因为你的包的一个副本存储在 nuget 缓存中。 嗨朋友,这个问题有什么更新吗?请检查我的回答是否有帮助,请参阅what should...。只是一个提醒:) 【参考方案1】:

我该如何解决这个问题?

要解决您身边的奇怪行为,您应该在当前项目中安装该软件包之前clean the nuget cache。

(为了确保缓存被清理,建议你去%userprofile%\.nuget\packages检查Packages文件夹中是否存在Com.lib文件夹)

我已经指定了 Microsoft.Extensions.Logging 的确切版本 即 [2.2.0] 我们可以在屏幕截图中确认 我的库的依赖项,那么为什么它被解析为版本 3.0.0?

我认为您要安装的(Com.Mylib)不是您打包的第一个。我的意思是,您实际上可能会构建和打包几个具有不同内容的不同 Com.Mylib 包。他们所有的名字都是Com.lib.1.0.0.nupkg

Nuget 将所有 nuget 缓存存储在 %userprofile%\.nuget\packages 中。因此,如果我曾经在任何项目中安装一个 PackageA。 PackageA 的缓存存储在那里。如果我打开一个新项目尝试安装具有相同版本 (1.0.0) 的 PackageA,它实际上会从缓存中安装一个。所以我们会遇到这种奇怪的行为:

Nuget 可以识别 Com.lib 包依赖于其他 2.2.0 包。但是当它尝试安装该软件包时,它发现该软件包已存在于缓存中。然后他尝试从缓存中安装一个,我猜缓存中的内容和你最新的不一样,然后问题就出现了。

建议:

1.在本地开发时,使用项目引用而不是Nuget包。

2.如果每次打包后都需要测试nuget包,请确保包版本已经增加。(1.0.0=>1.0.1=>1.0.3...或beta-1.0.12 , 预览-xxx)

3.如果您有特殊原因请使用相同的1.0.0版本,请clean the cache以避免以前的缓存影响当前项目。

希望以上所有帮助:)

【讨论】:

非常感谢@Lance Li-MSFT,删除 nuget 缓存解决了问题。

以上是关于nuget 没有使用 nuget 包中为 Microsoft.Extensions.Logging 指定的内容解决依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

从 Nuget 包中自动提取本机和托管 DLL

如何从通过 Jenkins 使用 Octopack 构建的 NuGet 包中排除目录和文件?

调试位于 nuget 包中的 C# 接口实现

如何调试我创建的 NuGet 包中的代码

使用 FHIR nuget 包通过引用查找包中的资源

nuget 包中 exe 文件的位置和 nuspec 中匹配的文件标记