2017-08-03 67 views
0

为了创建一个Json提供者,我需要传递一个文字与路径。有几个人从不同地点开展项目工作,每种情况下的路径都不相同。 (其实只是每条路径的开始)。我试图创建一个模式匹配的文字,但编译器不接受它。有没有另一种方法来做到这一点?我可以创建一个条件文字吗?

我失败的尝试低于:

open FSharp.Data 

[<Literal>] 
let bitbucketRoot = // Error message: This is not a valid constant expression 
    let computerName = Environment.MachineName 
    match computerName with 
    | "DESKTOP-G3OF32U" -> "C:\\Users\\Fernando" 
    | "HPW8" -> @"H:\Dropbox\" 
    | _ -> failwith "Unknown computer" 

[<Literal>] // Error message: This is not a valid constant expression 
let projDataPath = bitbucketRoot + @"Bitbucket\VSProjects\Fractal10\Fractal10\data\" 

[<Literal>] // Error message: This is not a valid constant expression 
let jsonPath = projDataPath + "fractal.json" 
type PathInfo = JsonProvider<Sample=jsonPath> 
+2

这不起作用 - 整个想法是在编译时需要知道文字 - 所以你不能这样做。 –

回答

1

您不能创建条件文字,因为其他评论指出它。然而,这是一个相当常见的用例,并处理它的方式如下:

#r @"..\packages\FSharp.Data\lib\net40\FSharp.Data.dll" 
open FSharp.Data 
open System 
open System.IO 

[<Literal>] 
let JsonSource = __SOURCE_DIRECTORY__ + @"\test.json" 

type JSonType = JsonProvider<JsonSource> 

let json1 = JSonType.GetSamples() 

let anotherPath = @"C:\tmp" 
let anotherJson = anotherPath + @"\test.json" 
let json2 = JSonType.Load(anotherJson) 

__SOURCE_DIRECTORY__指令将指向项目的根目录(只是在REPL显示它),然后你可以添加文件名并将其作为文字。如果你将这个文件检入git仓库,那么每个检查出来的人都可以在相对路径中找到它,并且可以在生成类型时引用它。当实际使用类型或引用完整文件时,您可以使用.Load()方法来加载任何文件,而且这不一定是文字。

实际上还有第二种方法,根据具体情况可以为您工作,编译样本并将其作为.dll分发。你可以参考这个并直接使用它,而无需访问实际的文件。请参阅文档末尾的Using the JSON Provider in a Library部分。

我还没有尝试过引用配置文件中的json,它可能也是可能的。

+1

Thaks。我将研究“在库中使用JSON提供程序”部分。但仅仅为了记录,我想解释一下,我正是因为'__SOURCE_DIRECTORY__'确实没有指向项目根目录,尽管在最常见的情况下这是真的。我解释说:我的代码工作正常,直到我将创建我的JSON提供程序的.fs文件和必要的文字移到另一个文件夹(以便它可以用于其他项目),并通过链接将其添加到我的项目中。在这种情况下,'__SOURCE_DIRECTORY__'指向这个其他文件夹,而不是我的项目的根目录。 – Soldalma

+0

@Soldalma我明白了。你可能也想看看[API doc](http://fsharp.github.io/FSharp.Data/reference/fsharp-data-jsonprovider.html)中的'ResolutionFolder'参数,但我认为必须是一个文字也是如此。我使用的另一种方法是在配置文件中定义连接字符串,但我不检查它。这取决于TP。最后你可以使用[JsonParser](http://fsharp.github.io/FSharp.Data/library/JsonValue.html),因为这不是一个TP,你可以加载任何东西。或者像Newtonsoft,fsharplu,chiron等另一个Json库。 – s952163

+1

好的,最后我的解决方案是将.fs文件放回到我的项目中,退出库文件夹,因此它不再链接。这样我和项目中的所有其他人都可以使用'__SOURCE_DIRECTORY__'。 – Soldalma

3

我会建议你把它保存在源代码控制和相对路径使其你的项目的根,假设你正在制订一个共同的源代码控制库中。

要么是这样,要么是将样本托管在公共URL上。 (我不会推荐这么做,因为将它包含在源代码库中允许版本化并且不公开公开您的数据)

+0

听起来不错,但我如何让我的项目根作为文字? – Soldalma

+2

@Soldalma你可以使用__SOURCE_DIRECTORY__或甚至只是../file.JSON作为解决方案的每个人共享的示例。对于其他路径只需使用.Load方法。这是所有TP的典型代表。 – s952163

相关问题