使用变量作为F#类型提供程序引用的文件的路径

nh2*_*nh2 2 f# sas type-providers

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

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

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

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

let sasfile = new SasFileTypeProvider<saspath>()
Run Code Online (Sandbox Code Playgroud)

但这不是有效的.它与F#中的Type提供者和静态参数有关,对于F#Type提供者,如何使相对路径作为静态参数工作?,但我没有使用相对路径的选项.

Tom*_*cek 5

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

使用相对路径.您可以更改代码以使用始终有效的相对路径吗?这将是理想的 - 假设类型提供者支持这一点.

改进类型提供者.您可以将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>()
Run Code Online (Sandbox Code Playgroud)