F# NuGet-已安装但未找到依赖项

F# NuGet-已安装但未找到依赖项,f#,nuget,dotnetrdf,nuget-spec,F#,Nuget,Dotnetrdf,Nuget Spec,我对NuGet包管理器有问题。我发布了我的库(一个类型提供程序,但我认为这并不重要),然后对它进行了测试,但它找不到依赖项。完整的错误消息为(为简洁起见,请填写完整的命名空间/名称): 问题是,在安装库时,依赖项似乎安装正确。已下载正确的库,并且没有显示错误。 为了解决这个问题,我在.nuspec文件中指定了确切的版本,但这并没有改变任何东西。 ... 通过NuGet安装dotNetRDF,然后手动引用我的预编译DLL(无需通过NuGet)似乎可以正常工作 所以我对如何解决甚至调试这个问题基本

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

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

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

所以我对如何解决甚至调试这个问题基本上没有想法。我很感谢你的指点

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

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

我切换到.NET4.0,但没有任何变化

  • My library=“.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的依赖项

。我通过命令nuget pack LITEQ.fsproj-Prop Configuration=Release创建包

包id为

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

因此,通过NuGet安装库之后,感觉项目配置出现了一些问题

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

open Uniko.West.Liteq

type A = NpqlRdfProvider< @"">
openuniko.West.Liteq
类型A=NpqlRdfProvider<@“>

当然对我来说,我看不到任何明显的问题,当我将您的包安装到一个空的控制台项目中时,我没有任何问题,我可以编写一个使用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”构建的 框架这是一个比当前目标版本更高的版本 framework“.NETFramework,版本=v4.0”

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

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

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

编辑-NuGet包版本 NuGet软件包版本不必与程序集版本相对应,因为1.0.6.3421的程序集版本恰好是1.0.3.0。这实际上不是我们的意图,而是我们构建过程中的一个缺陷,但这在这里并不重要

看起来您的库是根据与NuGet为您安装的dotNetRDF版本不同的dotNetRDF版本编译的。但是,如果看不到包的源代码,就不可能进一步调试

如果两种解决方案都不起作用怎么办? 如果这两种方法都不能解决您的问题,那么您将需要提供一个复制问题的最小项目。

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


...
...

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

可能与您的各种软件包使用的.Net framework版本有关。它们都使用相同的版本吗?我通过lo检查了框架版本
open Uniko.West.Liteq

type A = NpqlRdfProvider< @"">
<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>