2016-11-01 36 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關於它。

相關問題