代码之家  ›  专栏  ›  技术社区  ›  Soldalma

我可以创建条件文字吗?

  •  0
  • Soldalma  · 技术社区  · 7 年前

    为了创建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 回复  |  直到 7 年前
        1
  •  3
  •   Chad Gilbert    7 年前

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

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

        2
  •  1
  •   s952163    7 年前

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

    #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 repo,那么签出它的每个人都可以将其置于相对路径中,您可以在生成类型时引用它。当实际使用类型或引用完整文件时,您可以只使用 .Load()

    实际上还有第二种方法,可以根据具体情况对您有效,编译一个示例,并将其作为.dll分发。您可以引用它并直接使用它,而无需访问实际文件。请查看 Using the JSON Provider in a Library

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