2017-05-05 24 views
3

我正在写一个允许用户向其提供配置文件的类型提供程序。我使用TP的内部配置对象来识别ResolutionFolder,我使用它来获取配置文件的完全修补路径。大。如何在通过#load引用程序集时获取F#Type Provider的正确解析文件夹?

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

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

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

Inside 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并(固定路径到我的包的路径),它一切正常。

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

回答

6

我想我从来没有设法使相对路径解析在任何我参与的类型提供者中正确地工作。如果其他人可以弄清楚这一点,那将是惊人的。

迟早,我刚开始使用[<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")> 

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

+1

哈利路亚。这有效 - 谢谢。顺便说一句 - 哪里的关于'const'关键字的文档是F#4.1?没有见过它在任何地方记录 –

+1

我想''const'关键字神奇地出现在F#中,随着VS 2015 ... –

+0

甚至没有为我编译。文档仍然显示它是未来使用的保留关键词。 –

相关问题