如何将变量路径传递给类型提供程序?
我有一个要使用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>()