2016-11-01 8 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> 
に設定にアクセスしようとした場合

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

fullConfigPathエラーアウト

私はfullYamlPathについて同様のエラーを取得するのYAMLタイププロバイダ

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

を使用しようとしても。

ホームディレクトリ以外のファイルにアクセスできない理由はありますか?私はファイルパスを正しく構築していますか?

+2

型プロバイダ(あなたの場合は 'FilePath')の引数は、コンパイル時の定数(ハードコードされた文字列または文字列リテラルなので)である必要があります。 – scrwtp

答えて

5

短い答え:申し訳ありませんが、あなたはあなたのためにSelectExecutableFileことかもしれない仕事を使用して回避策があるが、おそらくは、ねじ込みです。

長い回答:
これは型プロバイダの仕組みではありません。

タイププロバイダを使用してタイプを提供すると、そのタイプの提供はコンパイル時に行われます(それ以外の場合、何がポイントになるでしょうか?)。これは、型プロバイダが受け取るすべての入力がでもであることをコンパイル時に知る必要があることを意味します。しかし、コードでfullConfigPathまたはfullYamlPathの値は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を提供します。これは、データのソースを一度選択するために呼び出すことができる静的メソッドです。そして、それはどちらかの設定ファイルのパスを取るが、それは、その後passes to ConfigurationManager.OpenExeConfigurationのみexeファイルパス、しません:

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

let someSetting = Config.SomeSetting; 

それはWebアプリケーションでどのように動作するかの私はわからないなります。 SelectExecutableFileに電話をかけて、自分の設定ファイルのサンセリフへのパスで.config拡張子を渡し、動作するはずです:

は、私は、これは回避策を与える可能性があるとします。しかし、ライブラリchecks for its presenceがあるので、同じ名前のダミーファイルを作成する必要があります(exeファイルのためにある.config拡張子はありません)。

最終行はです。あなたがしようとしていることに対するサポートはありません。それは残念ですが、私はあなたにそれについてfile an issueを提案します。

関連する問題