如何通过NuGet分发F#类型提供程序?

如何通过NuGet分发F#类型提供程序?,f#,nuget,type-providers,F#,Nuget,Type Providers,我的F#类型提供程序似乎无法工作,除非它的所有依赖项都在同一个文件夹中。这对于通过nuget分发类型提供程序来说效果不太好。对如何解决这个问题有什么建议吗 我将得到如下错误: 错误FS3033:类型提供程序“Froto.Gen.ProtoTypeProvider”报告错误:无法加载文件或程序集“Froto.Roslyn,版本=0.0.0.1,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件 类型提供程序在此库中: 软件包\Froto.Gen.0.0.1\

我的F#类型提供程序似乎无法工作,除非它的所有依赖项都在同一个文件夹中。这对于通过nuget分发类型提供程序来说效果不太好。对如何解决这个问题有什么建议吗

我将得到如下错误: 错误FS3033:类型提供程序“Froto.Gen.ProtoTypeProvider”报告错误:无法加载文件或程序集“Froto.Roslyn,版本=0.0.0.1,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件

类型提供程序在此库中: 软件包\Froto.Gen.0.0.1\lib\net45\Froto.Gen.dll

依赖项都在项目中。如果我将它们全部复制到packages\Froto.Gen.0.0.1\lib\net45\中,则类型提供程序可以工作

2012年11月19日更新:我今天将创建一个NuGet包来更好地解释这个问题。

这个问题不是针对F#的。你绝对必须这样做

  • 将所有必需的依赖项作为nuget包的一部分提供
  • 让NuGet知道您的包依赖于将提供所需引用的其他包
nuget包可以轻松包含多个DLL(如果正确打包)。您可以在此处阅读有关如何创建包的更多信息:


如果在将NuGet与项目msbuild脚本集成时遇到问题,我建议您查看其他开源项目用于构建NuGet软件包的脚本(例如,查看FSharpX或FSharp电源包)。

依赖于FSharpX.Core的FSharpX.TypeProviders也存在类似问题。解决方案是使用ILMerge将所有依赖项合并到类型提供程序中。检查线程

您的“Froto.Roslyn”DLL是否在其自己的Nuget包中可用?如果不是,您如何假设关闭“Froto.Gen.ProtoTypeProvider”的客户机可以访问依赖项?如果它不可用,它将不起作用(这就是为什么将所有依赖项复制到Nuget包中会起作用)。所有依赖项都会下载并成为项目的一部分。特定于F#的部分是,类型提供程序不从项目中加载类型,而只加载同一文件夹中的类型。我希望它能够从项目中找到依赖项。我可以在同一文件夹中包含某些依赖项,但我认为我无权包含某些依赖项,如Roslyn。@CameronTaggart:我不太明白您所说的“项目”是什么意思,但我假设您指的是MSBuild/VisualStudi中的程序集引用,最终应将其复制到bin/文件夹中项目程序集的旁边。我无法想象F#类型提供程序会偏离CLR的程序集加载规则,因此您的问题应该很容易解决。你能告诉我你的NuGet软件包吗?我可能在上面的语句中错了,在F#类型中,提供程序是在编译时而不是运行时调用的。这有点出乎意料,因为我认为它们的工作原理与System.Expression类似,后者在运行时编译。看起来您实际上必须按照@ovatsus的建议来做。将此ilmerge添加为msbuild目标是否有用。这个新目标可以通过一个金块添加到现有项目中