我可以创建条件文字吗?
Can I create a conditional literal?
为了创建一个 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>
我建议您将它存储在源代码管理中,并使其成为相对于您的项目根目录的路径,假设您使用的是公共源代码管理存储库。
要么,要么将示例托管在 public URL 上。 (我实际上不会推荐这个,因为将它包含在您的源存储库中允许版本控制并且不会 public 公开您的数据)
您不能像其他评论指出的那样创建条件文字。然而,这是一个相当频繁的用例,处理方法如下:
#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,这也许也是可能的。
为了创建一个 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>
我建议您将它存储在源代码管理中,并使其成为相对于您的项目根目录的路径,假设您使用的是公共源代码管理存储库。
要么,要么将示例托管在 public URL 上。 (我实际上不会推荐这个,因为将它包含在您的源存储库中允许版本控制并且不会 public 公开您的数据)
您不能像其他评论指出的那样创建条件文字。然而,这是一个相当频繁的用例,处理方法如下:
#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,这也许也是可能的。