【问题标题】:NuGet - dependency installed but not foundNuGet - 已安装但未找到依赖项
【发布时间】:2014-08-18 10:26:23
【问题描述】:

我的 NuGet 包管理器有问题。我发布了我的库(一个类型提供程序,但我认为这并不重要)然后测试它,但它找不到依赖项。完整的错误消息是(为简洁起见,省略了完整的命名空间/名称):

The type provider 'TypeProviderImplementation....' reported an error:
Could not load file or assembly 'dotNetRDF', Version=1.0.3.0, Culture=neutral, PublicKeyToken=...' or one of its dependencies.

问题是在安装库时,看起来依赖项已正确安装。下载了正确的库,并且没有出现错误。 为了解决这个问题,我在 .nuspec 文件中指定了确切的版本,但这并没有改变任何东西。 ...

通过 NuGet 安装 dotNetRDF,然后手动引用我的预编译 DLL(不通过 NuGet)似乎工作正常。

所以我基本上不知道如何解决甚至调试问题。感谢您的指点。

添加有关 .NET 版本号的更多信息,因为我在下面的评论很难阅读:

我按照建议检查了框架版本。我通过查看对象浏览器中的 FrameworkDisplayName 来做到这一点。基本上,我的库使用的是 4.5,而 dotNetRDF 使用的是 4.0。

我切换到 .NET 4.0,但没有任何改变。

  • 我的库 = ".NET Framework 4"
  • dotNetRDF = ".NET Framework 4"
  • HtmlAgilityPack = ".NET Framework 4.5"
  • Newtonsoft.Json = ".NET Framework 4.5"
  • VDS.Common = ".NET Framework 4 客户端配置文件"

我的依赖是dotNetRDF,剩下的都是dotNetRDF的依赖。

Latest NuSpec file can be found here。我通过命令 nuget pack LITEQ.fsproj -Prop Configuration=Release 创建包。

包 ID 是 LITEQ.RDF。

一些附加信息: 该库是一个 F# 项目。我刚刚测试了如果我创建一个控制台项目并通过 NuGet 安装库然后将引用发送到 F# 交互式控制台会发生什么。它实际上在这种情况下有效。

所以感觉通过NuGet安装库后项目配置有问题。

要重现错误,请下载库,打开 UniKo.West.Liteq 命名空间,例如使用 NpqlTypeProvider:

open Uniko.West.Liteq

type A = NpqlRdfProvider< @"">

【问题讨论】:

  • 可能与您的各种软件包使用的 .Net 框架版本有关。他们都使用相同的吗?
  • 我通过查看对象浏览器中的 FrameworkDisplayName 检查了框架版本。基本上,我的库使用的是 4.5,而 dotNetRDF 使用的是 4.0。我切换到 .NET 4.0,但没有任何改变。 * 我的库 = ".NET Framework 4" * dotNetRDF = ".NET Framework 4" * HtmlAgilityPack = ".NET Framework 4.5" * Newtonsoft.Json = ".NET Framework 4.5" * VDS.Common = ".NET Framework 4 Client Profile”我的依赖是dotNetRDF,剩下的都是dotNetRDF的依赖。
  • 请提供您的 NuSpec 定义,否则我们只能猜测问题。此外,如果您已发布 NuGet 包,请提供包 ID
  • 是的,你是对的。从一开始就应该这样做。我用 NuSpec 文件和包 ID 的链接更新了问题。

标签: f# nuget dotnetrdf nuget-spec


【解决方案1】:

当然,对我来说,我看不到任何明显的问题,当我将你的包安装到一个空的控制台项目中时,我没有任何问题,我可以编写一个使用 dotNetRDF API 的简单示例。如果您可以生成一个最小的示例项目,在该项目中安装软件包会产生问题,那么这将非常有帮助。

您的问题

但是,您为项目声明的依赖项看起来有问题,您的项目有 .Net 4.0 和一些依赖项,但其他的 .Net 4.5 将不起作用。请注意,当您降级项目的目标框架时,NuGet 无法很好地应对这种情况,最好在您更改目标框架版本时完全卸载并重新安装 NuGet 包。框架的新版本依赖于针对旧版本的依赖项是非常好的,因此您的 .Net 4.5 项目可以愉快地依赖 .Net 4.0 版本的 dotNetRDF。然而,相反的情况并非如此,这可能是您的问题的原因。

您有时可以判断是否是这种情况,因为 VS 可能会在解决方案资源管理器中的“引用”下突出显示不良依赖项,并带有很少的警告图标(遗憾的是,它并不总是这样做)。即使不是这种情况,当您尝试构建时,如果您有不兼容的依赖项,您应该在输出窗口中看到如下输出,这也可能会产生有关缺少命名空间的编译错误:

C:\程序文件 (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): 警告 MSB3274:主要参考“HtmlAgilityPack”不能 已解决,因为它是针对“.NETFramework,Version=v4.5”构建的 框架。这是比当前目标更高的版本 框架“.NETFramework,Version=v4.0”。

因此,我强烈建议您在更改项目的目标 .Net 框架时通过 NuGet 卸载所有包并重新安装它们。

其他问题

关于您使用的 dotNetRDF 1.0.3(不是最新版本)的其他可能问题,1.0.5 之前的版本存在与 Json.Net 的版本控制和框架配置文件交互相关的已知问题。如果您要安装的项目也依赖于 Json.Net,您可能会遇到版本冲突问题。有关这方面的一些讨论,请参阅 CORE-405: Resolve Issues with Json.Net dependency。

我建议您在撰写此答案时还将您的依赖项升级到最新的 dotNetRDF 版本,即 1.0.6.3421,看看是否能解决您的问题。

编辑 - NuGet 包版本

NuGet 包版本不必与程序集版本相对应,因为 1.0.6.3421 确实具有 1.0.3.0 的程序集版本。这实际上不是我们的意图,而是我们构建过程中的一个缺陷,但在这里并不真正相关。

看起来您的库是针对不同版本的 dotNetRDF 编译的,而不是 NuGet 为您安装的版本。但是,如果没有看到包的来源,就无法进一步调试。

如果两种解决方案都不起作用怎么办?

如果这些方法都不能解决您的问题,那么您将需要提供一个重现问题的最小项目。

【讨论】:

  • 首先感谢您的回答。我听从了您的建议并通过 NuGet 卸载了所有依赖项,然后重新安装了它们。我还删除了指定 dotNetRDF 1.0.3.0 的 nuspec 语句。问题仍然存在。错误消息仍然相同 - (无法加载文件或程序集 'dotNetRDF, Version=1.0.3.0, ...' 或其依赖项之一)。有趣的是版本。我不明白为什么它抱怨 1.0.3。正在下载的 dotNetRDF 依赖项是最新的 (1.0.6.3421)。
【解决方案2】:

一个临时解决方案(或更多的破解)是不依赖依赖项,而是直接将 DLL 放入 NuGet 包中。当我这样做时,图书馆工作正常。本例中的 NuSpec 文件如下所示(摘录):

<package>
    <metadata>
        ...
    </metadata>
    <files>
        <file src="bin\Release\dotNetRDF.dll" target="lib/net40" />
        <file src="bin\Release\HtmlAgilityPack.dll" target="lib/net40" />
        <file src="bin\Release\HtmlAgilityPack.pdb" target="lib/net40" />
        <file src="bin\Release\HtmlAgilityPack.xml" target="lib/net40" />
        ...
    </files>
</package>

但显然,这不是一个好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多