我可以创建条件文本吗?



为了创建一个 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 + @"BitbucketVSProjectsFractal10Fractal10data" 
[<Literal>] // Error message: This is not a valid constant expression
let jsonPath = projDataPath + "fractal.json"
type PathInfo = JsonProvider<Sample=jsonPath>

我建议您将其存储在源代码管理中,并使其成为相对于项目根目录的路径,假设您正在使用公共源代码管理存储库。

要么,要么在公共 URL 上托管示例。(我实际上不建议这样做,因为将其包含在源存储库中允许版本控制并且不会公开您的数据(

您不能像其他注释指出的那样创建条件文本。但是,这是一个相当常见的用例,处理方法如下:

#r @"..packagesFSharp.Datalibnet40FSharp.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分发。您可以参考它并直接使用它,而无需访问实际文件。请参阅文档末尾的在库中使用 JSON 提供程序部分。

我还没有尝试在配置文件中引用 json,也可能。

最新更新