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

Isa*_*ham 3 f# type-providers f#-scripting paket

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

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

.paket
   |--.load
   |     |-- net452
   |           |-- main.group.fsx
   |--src
       |-- myscript.fsx
       |-- config.json
Run Code Online (Sandbox Code Playgroud)

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

在内部myscript.fsx我调用#load "..\.paket\.load\net452\main.group.fsx" 加载所有依赖项(包括我的TP本身),它工作正常.

然而

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

type MyTPInstance = MyTp<myConfig = "config.json">
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,我的TP捕获并显示: -

The type provider reported an error: Unable to locate config file
"C:\Users\Isaac\Source\Repos\myRepo\.paket\load\net452\config.json"
Run Code Online (Sandbox Code Playgroud)

换句话说 - 看起来因为我从生活在另一个文件夹中的脚本引用了我的TP程序集,这是 FSI用作解析文件夹的文件夹 - 而不是正在运行的脚本的文件夹.我可以证明,这是问题,因为如果我的内容复制main.group.fsxmyscript.fsx直接(固定的路径,我当然包),这一切工作正常.

我怎样才能解决这个问题?其他人如何解决这个问题?

Tom*_*cek 7

我想我从未设法让相关路径解析在我参与的任何类型提供程序中正常工作.如果其他人能够解决这个问题,那将是惊人的.

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

[<Literal>]
let MyConfig = __SOURCE_DIRECTORY__ + "/config.json"
type MyTPInstance = MyTp<myConfig = MyConfig>
Run Code Online (Sandbox Code Playgroud)

const最近有点好了:

type MyTPInstance = MyTp<myConfig = const(__SOURCE_DIRECTORY__ + "/config.json")>
Run Code Online (Sandbox Code Playgroud)

它仍然非常难看,但至少它可靠地工作.