如何将变量路径传递给类型提供程序?

我有一个要使用SAS类型提供程序加载的文件,该文件位于不同PC上的不同位置。

例如,我想做类似的事情:

[<Literal>]
let saspath =
    match System.Environment.MachineName with
    | "a" -> "c:/sas.sas7bdat"
    | "b" -> "d:/sas.sas7bdat"

let sasfile = new SasFileTypeProvider<saspath>()

但这是无效的。它与此Type provider and static argument in F#For an F# Type Provider, how do I make a relative path work as a static parameter?有关,但是我没有使用相对路径的选择。

最佳答案

不幸的是,这不容易实现。传递给类型提供程序的参数必须(在语法上)是常量。有多种解决方法。

使用相对路径。 您可以更改代码以使用始终有效的相对路径吗?这将是理想的-假设类型提供程序支持此操作。

改进类型提供程序。 您可以将PR发送到SAS类型提供程序,以便它可以从本地配置文件或环境变量中获取文件名。许多SQL类型提供程序都这样做,因为如果需要一些配置,这是一个很好的解决方案。

生成具有常量的文件。 ,这有点麻烦,但是您可以使用常量和fsx生成单独的#load文件。在其余的代码中(直到运行脚本的第一部分),您将遇到红色的弯曲,但是如果您对此感到满意:

open System.IO
let text =
  match System.Environment.MachineName with
  | "a" -> "module Constants\n[<Literal>] let path = \"c:/sas.sas7bdat\""
  | "b" -> "module Constants\n[<Literal>] let path = \"c:/sas.sas7bdat\""
File.WriteAllText("C:/temp/constants.fsx", text)
;;

#load "C:/temp/constants.fsx"
let sasfile = new SasFileTypeProvider<Constants.path>()

09-11 15:56