2017-02-06 1 views
1

Ich verwende den F # -Typ Provider zum ersten Mal in Azure-Funktionen. Hier ist die run.fsx Datei:Azure-Funktionen und F # Json-Typ Provider

#r "FSharp.Data" 
#r "Microsoft.WindowsAzure.Storage" 

open System 
open FSharp.Data 
open Microsoft.WindowsAzure.Storage.Table 

type Tweet = JsonProvider<"sample.json"> 

let Run (queueItem: string, tweets: ICollector<Tweet>) = 
    () 

Hier wird die project.json Datei:

{ 
    "frameworks": { 
    "net46": { 
     "dependencies": { 
     "FSharp.Data": "2.3.2" 
     } 
    } 
    } 
} 

sample.json im selben Ordner wie die anderen Dateien befindet sich

Wenn ich laufen es, ich bekomme das:

 
> 2017-02-06T13:40:22.946 
> D:\home\site\wwwroot\TweeterDataCleaner\run.fsx(9,14): error FS3033: 
> The type provider 'ProviderImplementation.JsonProvider' reported an 
> error: Cannot read sample JSON from 'sample.json': Could not find file 
> 'D:\Windows\system32\sample.json' 

Irgendwelche Vorschläge? Dank

Antwort

2

ich eine Abhilfe gefunden, wenn ich ähnliches Problem hatte - mit __SOURCE_DIRECTORY__ Wert (Konstante Symbol Ich bin mir nicht sicher, was es genau ist?):

[<Literal>] 
let sample = __SOURCE_DIRECTORY__ + "/sample.json" 
type Tweet = JsonProvider<sample> 

Ich würde gerne dort lernen, wenn ist eine bessere Möglichkeit, dies zu spezifizieren.

+2

Das hat funktioniert - danke. Ich fragte Don Syme, was __SOURCE_DIRECTORY__ ist, sagte er "Errr. Ein Hack?" –

+0

Im Idealfall würden Azure-Funktionen das Arbeitsverzeichnis für eine Funktionsausführung auf diese Funktion festlegen. Derzeit nicht. SOURCE_DIRECTORY sieht wie ein Makro aus, das in das Verzeichnis der F # -Quelldatei aufgelöst wird, etwa wie folgt: $ env: HOME + '/ site/wwwroot//'. Dies ist definitiv der einfachste Weg, dies zu tun, da ich glaube, dass das Ändern des Funktionsarbeitsverzeichnisses das Arbeitsverzeichnis für andere .net-Funktionen ebenfalls ändern könnte. –

+0

Das obige Muster (mit der HOME-Umgebungsvariablen + Pfad) ist der empfohlene Ansatz für jetzt. Wir planen, dies auf eine bequemere Weise zu enthüllen, so dass Sie nicht durch Reifen springen müssen. –