NuGet - 已安装依赖但未找到

时间:2014-08-18 10:26:24

标签: f# nuget dotnetrdf nuget-spec

我遇到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 Client Profile”

我的依赖是dotNetRDF,其余的是dotNetRDF的依赖。

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

包ID为LITEQ.RDF

其他一些信息: 该库是一个F#项目。我刚刚测试了如果我创建一个控制台项目并通过NuGet安装库然后将引用发送到F#Interactive Console会发生什么。它实际上适用于这种情况。

因此,通过NuGet安装库后,感觉项目配置存在问题。

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

open Uniko.West.Liteq

type A = NpqlRdfProvider< @"">

2 个答案:

答案 0 :(得分:0)

当然对我来说,我无法看到任何明显的问题,当我将你的软件包安装到一个空的控制台项目时,我没有任何问题,我可以写一个简单的例子,使用dotNetRDF API就好了。如果您可以生成一个最小的示例项目,安装包会在其中创建一个问题,那将非常有用。

您的问题

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

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

  

C:\ Program Files   (86)\的MSBuild \ 12.0 \ BIN \ Microsoft.Common.CurrentVersion.targets(1697,5):   警告MSB3274:主要参考&#34; HtmlAgilityPack&#34;不可能   已解决,因为它是根据&#34; .NETFramework,Version = v4.5&#34;   框架。这是比当前目标版本更高的版本   framework&#34; .NETFramework,Version = v4.0&#34;。

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

其他问题

就使用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为你安装的版本。但是,如果没有看到包的来源,则无法进一步调试。

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

如果这些事情都没有解决您的问题,那么您将需要提供一个可以重现问题的最小项目。

答案 1 :(得分:0)

临时解决方案(或更多的黑客攻击)不依赖于依赖关系,而是直接将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>

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