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提供者,如何使相对路径作为静态参数工作?,但我没有使用相对路径的选项.
不幸的是,这不容易实现.传递给类型提供程序的参数必须是(语法)常量.有各种解决方法.
使用相对路径.您可以更改代码以使用始终有效的相对路径吗?这将是理想的 - 假设类型提供者支持这一点.
改进类型提供者.您可以将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)