通过#load 引用程序集时如何获取 F# Type Provider 的正确解析文件夹?

How to get correct resolution folder of F# Type Provider when referencing assemblies via #load?

我正在编写一个允许用户向其提供配置文件的类型提供程序。我使用 TP 的内部配置对象来识别 ResolutionFolder,我用它来获取配置文件的完全限定路径。太好了。

但是,在使用脚本时,我使用 Paket 的自动生成的加载脚本来加载我的依赖项。文件路径如下所示:-

.paket
   |--.load
   |     |-- net452
   |           |-- main.group.fsx
   |--src
       |-- myscript.fsx
       |-- config.json

myscript.fsx 包含我的脚本代码。 config.json 包含我将在脚本中创建的类型提供程序实例的配置。

myscript.fsx 中,我调用 #load "..\.paket\.load\net452\main.group.fsx" 加载所有依赖项(包括我的 TP 本身),效果很好。

然而

然后当我尝试在脚本中进一步初始化类型提供程序时:-

type MyTPInstance = MyTp<myConfig = "config.json">

我的 TP 捕获并显示了一个错误:-

The type provider reported an error: Unable to locate config file
"C:\Users\Isaac\Source\Repos\myRepo\.paket\load\net452\config.json"

换句话说 - 似乎因为我从另一个文件夹中的脚本引用了我的 TP 程序集,那是 FSI 用作解析文件夹的文件夹 -而不是正在 运行 的脚本文件夹。我可以证明这是问题所在,因为如果我将 main.group.fsx 的内容直接复制到 myscript.fsx 并且(当然修复我的包的路径),一切正常。

我该如何解决这个问题?其他人如何解决这个问题?

我认为我从未设法使相对路径解析在我参与的任何类型提供程序中正常工作。如果其他人能解决这个问题,那就太棒了。

迟早,我刚开始使用[<Literal>]__SOURCE_DIRECTORY__给类型提供者一个绝对路径:

[<Literal>]
let MyConfig = __SOURCE_DIRECTORY__ + "/config.json"
type MyTPInstance = MyTp<myConfig = MyConfig>

最近 const 变得更好了:

type MyTPInstance = MyTp<myConfig = const(__SOURCE_DIRECTORY__ + "/config.json")>

它仍然很丑陋,但至少它工作可靠。