【问题标题】:How do I distribute an F# Type Provider via NuGet?如何通过 NuGet 分发 F# 类型提供程序?
【发布时间】:2012-11-18 20:47:03
【问题描述】:

除非所有依赖项都在同一个文件夹中,否则我的 F# 类型提供程序似乎无法正常工作。这不适用于通过 nuget 分发类型提供程序。有关如何解决此问题的任何建议?

我会收到如下错误: 错误 FS3033:类型提供程序“Froto.Gen.ProtoTypeProvider”报告错误:无法加载文件或程序集“Froto.Roslyn,Version=0.0.0.1,Culture=neutral,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

类型提供程序在这个库中: 包\Froto.Gen.0.0.0.1\lib\net45\Froto.Gen.dll

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

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

【问题讨论】:

  • 您的“Froto.Roslyn”DLL 在其自己的 Nuget 包中可用吗?如果不是,您如何假设关闭“Froto.Gen.ProtoTypeProvider”的客户端可以访问依赖项?如果它不可用,它将不起作用(这就是为什么将所有依赖项复制到 Nuget 包中起作用的原因)。

标签: f# nuget type-providers


【解决方案1】:

此问题并非特定于 F#。你绝对必须要么

  • 将所有必需的依赖项作为 nuget 包的一部分提供
  • 让 NuGet 知道您的包依赖于将提供所需参考的其他包

一个 nuget 包可以很容易地包含多个 dll(如果打包正确)。您可以在此处阅读有关如何创建包的更多信息:http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package

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

【讨论】:

  • NuGet 包确实引用了所需的依赖项。所有依赖项都被下载并成为项目的一部分。特定于 F# 的部分是类型提供程序不会从项目中加载类型,而只会加载同一个文件夹。我期待它能够从项目中找到依赖项。我可以在同一个文件夹中包含一些依赖项,但我认为我无权包含一些依赖项,例如 Roslyn。
  • @CameronTaggart:我真的不明白你所说的“项目”是什么意思,但我假设你的意思是 MSBuild/VisualStudi 中的程序集引用,它最终应该被复制到你的项目程序集旁边bin/ 文件夹。我无法想象 F# 类型提供程序会偏离 CLR 的程序集加载规则,因此您的问题应该很容易解决。你能给我指点你的 NuGet 包吗?
  • 我实际上可能对上述陈述有误,似乎在 F# 类型中,提供程序是在编译时而不是运行时调用的。这有点出乎意料,因为我认为它们的工作方式类似于在运行时编译的 System.Expression。看来您实际上必须按照@ovatsus 的建议去做。
【解决方案2】:

依赖于 FSharpx.Core 的 FSharpx.TypeProviders 也存在类似问题。解决方案是使用 ILMerge 将所有依赖项合并到类型提供程序中。查看https://github.com/fsharp/fsharpx/issues/91中的线程

【讨论】:

  • 将此 ilmerge 添加为 msbuild 目标是否有用。这个新目标可以通过金块添加到现有项目中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多