F# 不配置文件I';m引用需要在项目中';谁的主目录?

F# 不配置文件I';m引用需要在项目中';谁的主目录?,f#,config,F#,Config,我正在尝试将连接字符串和凭据数据存储在.config文件中。我无法将带有连接/凭据的配置推送到repo;配置文件将位于一个安全的同步文件夹中,该文件夹不是主目录 我可以将连接/凭据存储在主目录的app.config文件中,并使用FSharp.Configuration库访问它: type connection = AppSettings<"app.config"> 即使我尝试使用yaml类型提供程序 let yamlPath = "Tresor\Config.yaml" let f

我正在尝试将连接字符串和凭据数据存储在
.config
文件中。我无法将带有连接/凭据的配置推送到repo;配置文件将位于一个安全的同步文件夹中,该文件夹不是主目录

我可以将连接/凭据存储在主目录的
app.config
文件中,并使用
FSharp.Configuration
库访问它:

type connection = AppSettings<"app.config">
即使我尝试使用yaml类型提供程序

let yamlPath = "Tresor\Config.yaml"
let fullYamlPath = Path.Combine(baseDirectory'.FullName, yamlPath)
type Config = YamlConfig<FilePath = fullYamlPath>
let yamlPath=“Tresor\Config.yaml”
让fullYamlPath=Path.Combine(baseDirectory.FullName,yamlPath)
类型Config=YamlConfig
对于
fullYamlPath
,我得到了一个类似的错误


我不能访问主目录以外的文件有什么原因吗?我是否正确构建了文件路径?

简短回答:对不起,您可能被搞砸了,尽管使用
SelectExecutableFile
有一种解决方法可能适合您

详细回答:
这不是类型提供程序的工作方式

当您使用类型提供程序为您提供类型时,类型的提供发生在编译时(否则,重点是什么?)。这意味着类型提供程序接受的所有输入也需要在编译时知道。但是在您的代码中,
fullConfigPath
fullYamlPath
的值在执行
Path.Combine
之前是未知的,这只会在运行时发生

它的工作方式是,类型提供程序将获取一些“模板”文件(或数据库,或URL,或其他任何内容),它可以分析这些文件并从其内容生成类型。然后,稍后,在运行时,您将指定从何处获取实际数据

重申一下,这一切都分为两个阶段:

  • 编译时的数据形状(又名“结构”又名“模式”)
  • 运行时的实际数据
  • 数据库提供程序通常是这样工作的:

    // Pseudocode. I don't have actual libraries handy.
    type Db = SqlProvider<"Server=localhost;Database=my_development_db;Integrated Security=true">
    
    let dbConnection = Db.OpenConnection Config.ProductionConnectionString
    
    不幸的是,情况并非如此(出于某种原因)

    YamlConfig
    提供程序无法加载备用配置文件(它将始终查找编译时指定的配置文件)。但是
    AppSettings
    提供程序确实通过
    SelectExecutableFile
    方法为您提供。这是一个静态方法,您可以调用它来一次性地选择数据源。它也不采用配置文件路径,只采用
    exe
    文件路径,然后:

    type Config=AppSettings
    Config.SelectExecutableFile“MyProgram.exe”
    让someSetting=Config.someSetting;
    
    这让我不确定它将如何与网络应用程序一起工作

    我想这可能会提供一个解决方案:调用
    选择ExecutableFile
    并将路径传递到您的配置文件,而不使用
    .config
    扩展名,这应该可以工作。但是您还需要创建一个具有相同名称的虚拟文件,但是没有扩展名
    .config
    (它将代表
    exe
    文件),因为库


    底线是,您试图做的事情不受支持,这很遗憾,我建议您这样做。

    类型提供程序的参数(在您的情况下,
    文件路径
    )需要是编译时常量(因此硬编码字符串或字符串文本)。对于现在遇到此问题的任何人,我想指出YAML提供程序现在在运行时加载配置的类型上有一个
    Load
    函数。
    let yamlPath = "Tresor\Config.yaml"
    let fullYamlPath = Path.Combine(baseDirectory'.FullName, yamlPath)
    type Config = YamlConfig<FilePath = fullYamlPath>
    
    // Pseudocode. I don't have actual libraries handy.
    type Db = SqlProvider<"Server=localhost;Database=my_development_db;Integrated Security=true">
    
    let dbConnection = Db.OpenConnection Config.ProductionConnectionString
    
    type Config = AppSettings<"app.config">
    let config = Config.OpenConfigFile "MyProgram.exe.config"
    let someSetting = config.SomeSetting;
    
    type Config = AppSettings<"app.config">
    Config.SelectExecutableFile "MyProgram.exe"
    
    let someSetting = Config.SomeSetting;