2017-08-03 10 views
0

Jsonプロバイダを作成するには、パス付きリテラルを渡す必要があります。異なる場所からプロジェクトに取り組んでいる人はいろいろあり、それぞれのパスはそれぞれ異なります。 (実際には各パスの始まりのみ)。パターンマッチングでリテラルを作成しようとしましたが、コンパイラはそれを受け付けません。これを行う別の方法がありますか?条件付きリテラルを作成できますか?

私の失敗した試みは、以下の通りです:

open FSharp.Data 

[<Literal>] 
let bitbucketRoot = // Error message: This is not a valid constant expression 
    let computerName = Environment.MachineName 
    match computerName with 
    | "DESKTOP-G3OF32U" -> "C:\\Users\\Fernando" 
    | "HPW8" -> @"H:\Dropbox\" 
    | _ -> failwith "Unknown computer" 

[<Literal>] // Error message: This is not a valid constant expression 
let projDataPath = bitbucketRoot + @"Bitbucket\VSProjects\Fractal10\Fractal10\data\" 

[<Literal>] // Error message: This is not a valid constant expression 
let jsonPath = projDataPath + "fractal.json" 
type PathInfo = JsonProvider<Sample=jsonPath> 
+2

これはうまくいきません。つまり、コンパイル時にリテラルを知っておく必要があるということです。これを行うことはできません。 –

答えて

1

他のコメントが指摘するように条件付きリテラルを作成することはできません。しかし、これはかなり頻繁に使用する場合で、次のようにそれに対処する方法は次のとおりです。

#r @"..\packages\FSharp.Data\lib\net40\FSharp.Data.dll" 
open FSharp.Data 
open System 
open System.IO 

[<Literal>] 
let JsonSource = __SOURCE_DIRECTORY__ + @"\test.json" 

type JSonType = JsonProvider<JsonSource> 

let json1 = JSonType.GetSamples() 

let anotherPath = @"C:\tmp" 
let anotherJson = anotherPath + @"\test.json" 
let json2 = JSonType.Load(anotherJson) 

__SOURCE_DIRECTORY__ディレクティブは、プロジェクトのルートを指しています(ただREPLで表示)して、ファイル名を追加することができますそれを文字通りにする。このファイルをgitリポジトリにチェックインすると、チェックアウトした人はすべてそのファイルを相対パスに置くことができ、そのファイルを生成するときに参照することができます。実際にタイプを使用するかフルファイルを参照する場合は、.Load()メソッドを使用してファイルをロードすることができますが、これはリテラルである必要はありません。

実際には状況に応じて動作し、サンプルをコンパイルし、.dllとして配布できる2番目の方法があります。これを参照して、実際のファイルにアクセスすることなく直接使用することができます。ドキュメントの末尾にあるUsing the JSON Provider in a Libraryセクションを参照してください。

設定ファイルでjsonを参照しようとしていませんでした。

+1

Thaks。ここでは、「ライブラリでのJSONプロバイダの使用」を参照します。しかし、記録のために、私はこの問題を正確に説明したいと思っています。なぜなら、 '__SOURCE_DIRECTORY__'は必ずしもプロジェクトのルートを指すわけではありません。私の説明:JSONプロバイダと必要なリテラルを作成する.fsファイルを別のフォルダに移動して(他のプロジェクトに使用できるように)、リンクを介してプロジェクトに追加するまで、私のコードは正常に動作していました。その場合、 '__SOURCE_DIRECTORY__'はこのプロジェクトのルートではなく、この他のフォルダを指しています。 – Soldalma

+0

@ソルダルマよね。 [API doc](http://fsharp.github.io/FSharp.Data/reference/fsharp-data-jsonprovider.html)の 'ResolutionFolder'パラメータも見たいかもしれませんが、私はそうしなければならないと思いますリテラルも同様です。私が使うもう一つの方法は、設定ファイルに接続文字列を定義することです。その文字列をチェックしません。これはTPにも依存します。最後に、[JsonParser](http://fsharp.github.io/FSharp.Data/library/JsonValue.html)を使用することができます。TPは何もロードできないためです。または、Newtonsoft、fsharplu、chironなどの別のJsonライブラリ – s952163

+1

最後に、私の解決策は、.fsファイルをライブラリフォルダからプロジェクトに戻して、リンクされなくなったからです。このようにして、私とプロジェクトに関わるすべての人は '__SOURCE_DIRECTORY__'を使うことができます。 – Soldalma

3

私はあなたがソース管理に保管することを助言し、あなたは、共通のソース管理リポジトリの外に作業していると仮定すると、プロジェクトのルートにそれを相対パスになるだろう。

いずれか、またはパブリックURLでサンプルをホストします。 (私は実際にはこれをお勧めしません。なぜなら、あなたのソースリポジトリにそれを含めればバージョン管理が可能になり、あなたのデータを公開しないからです)。

+0

いいですが、私のプロジェクトルートをリテラルとしてどうやって得るのですか? – Soldalma

+2

@Soldalma __SOURCE_DIRECTORY__または単に../file.JSONを使用することができます。これは、ソリューションで作業するすべての人が共有するサンプルです。他のパスの場合は.Loadメソッドを使用します。これはすべてのTPの典型です。 – s952163

関連する問題