2016-11-01 35 views
2

我试图将连接字符串和凭据数据存储在.config文件中。我无法将连接/凭证的配置推送到回购站;该配置将位于安全的已同步文件夹中,该文件夹的主目录不是而是我引用的配置文件需要在项目的主目录中吗?

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

type connection = AppSettings<"app.config"> 

但如果我尝试在不同的目录访问配置

open System.IO 
open FSharp.Configuration 

let baseDirectory = __SOURCE_DIRECTORY__ 
let baseDirectory' = Directory.GetParent(baseDirectory) 
let configPath = "Tresor\app.config" 
let fullConfigPath = Path.Combine(baseDirectory'.FullName, configPath) 
type Settings = AppSettings<fullConfigPath> 

fullConfigPath错误出与

This is not a valid constant expression or custom attribute value. 

即使我尝试使用YAML类型提供

let yamlPath = "Tresor\Config.yaml" 
let fullYamlPath = Path.Combine(baseDirectory'.FullName, yamlPath) 
type Config = YamlConfig<FilePath = fullYamlPath> 

我得到了fullYamlPath类似的错误。

是否有原因我无法访问主目录之外的文件?我正确构建文件路径吗?

+2

类型提供者的参数(在你的情况下,'FilePath')需要是编译时常量(所以要么是硬编码的字符串,要么是字符串文字)。 – scrwtp

回答

5

简短的回答:抱歉,您可能拧紧,虽然有使用SelectExecutableFile威力工作你一个解决办法。

长答案:
这不是类型提供者的工作方式。

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

的方式应该工作时,该类型的供应商将采取一些“模板”文件(或数据库,或URL,或不惜一切代价),它可以分析和生成你从它的内容的类型。然后,稍后,在运行时,您将指定从哪里获取实际的数据

要重申,这一切都发生在两个阶段:在编译时

  1. 数据形状(又名“结构”又名“方案”)。
  2. 运行时的实际数据。

这是怎么数据库提供商平时工作:

// 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 

理论上,既AppSettingsYamlConfig提供商将工作有些类似:

type Config = AppSettings<"app.config"> 
let config = Config.OpenConfigFile "MyProgram.exe.config" 
let someSetting = config.SomeSetting; 

不幸的是,这种情况并非如此(因为某些原因)。

YamlConfig提供程序没有任何方法来加载备用配置文件(它将始终查找在编译时指定的文件)。但AppSettings提供商确实通过SelectExecutableFile方法为您提供some control。这是一种静态方法,您可以调用该方法以便一劳永逸地选择数据源。而且它不会把配置文件路径要么,但只有exe文件路径,它然后passes to ConfigurationManager.OpenExeConfiguration

type Config = AppSettings<"app.config"> 
Config.SelectExecutableFile "MyProgram.exe" 

let someSetting = Config.SomeSetting; 

这让我不确定它会如何与一个Web应用程序的工作。

我想这可以给解决方法:打电话SelectExecutableFile和路径传递到您的配置文件SAN的扩展.config,应该工作。但是,您还需要创建一个具有相同名称的虚拟文件,但没有.config扩展名(这将代表exe文件),因为库checks for its presence

底线是,没有支持你想要做什么,这是一个耻辱,我建议你file an issue关于它。

相关问题