2017-09-18 1 views
1

Visual Studio 2015 및 2017에서는 FSharp Interactive의 여러 F # 예제에서 Http 클래스를 시험해보고 있습니다.왜 F # 오류가 발생합니까? FS0039 : 네임 스페이스 또는 모듈 'Http'가 정의되어 있지 않습니다.

오류 FS0039 :

open FSharp.Data 
let response = Http.RequestString("http://api.themoviedb.org/3/search/movie", silentHttpErrors = true) 

이 FSharp.Data의 버전 명확 때문이다 : 네임 스페이스 또는 모듈 'HTTP를'이

을 정의되지 여기에 샘플입니다. FSharp Interactive에 올바른 버전을 지정하는 방법이 있습니까? FSharp.Data의 어떤 버전에 Http 모듈이 들어 있습니까?

+1

라이브러리를 참조 했습니까? –

+0

내 'open FSharp.Data'를 사용하면 오래된 버전을 참조합니까? 어떻게하면 FSharp 대화 형에서 최신 FSharp.Data.dll을 참조 할 수 있습니까? – reckface

+0

당신은 nuget 또는 paket을 통해 FSharp.Data를 설치해야합니다. 프로젝트/솔루션 폴더의 패키지 하위 폴더로 이동합니다. 그런 다음 fsx 파일에서 fsroj 파일 (fs 파일 용) 또는 '#r path/to/Fsharp/Data/Dll'을 통해 참조를 참조하십시오. 그 후에는 열 수 있습니다. 아마도 이러한 단계 중 하나가 누락되었습니다. 이전 (v 3) 유형 공급자 때문에 전역 FSharp.Data 네임 스페이스가 있습니다. 그냥 여는 것일 수도 있습니다. 그러나 실제로는이 패키지를 채워야합니다. 핑 # F 채팅 또는 필요한 경우 느슨하게. – s952163

답변

0

주석에 따라 Paket을 설치하고 초기화하고 스크립트가 실행될 때마다 종속성을 선택적으로 설치하는 스크립트를 작성했습니다.

/// install.paket.fsx 
open System 
open System.IO 

printfn "Initialising..." 
Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 
// invisibly run a command (paket.exe in this case) 
let init paket = 
    let psi = new System.Diagnostics.ProcessStartInfo(paket) 
    psi.Arguments <- "init" 
    psi.UseShellExecute <- false 
    let p = System.Diagnostics.Process.Start(psi) 
    p.WaitForExit() 
    p.ExitCode 

if not (File.Exists "paket.exe") then 
    printfn "installing paket" 
    let url = "http://fsprojects.github.io/Paket/stable" 
    use wc = new Net.WebClient() 
    let tmp = Path.GetTempFileName() 
    let stable = wc.DownloadString(url) 
    wc.DownloadFile(stable, tmp) 
    File.Move(tmp,Path.GetFileName stable) 
    printfn "paket installed" 
    System.Threading.Thread.Sleep(100) 
    printfn "initialising paket" 
    init "paket.exe" |> ignore 
    System.Threading.Thread.Sleep(200) 
    printfn "paket initialised" 
else 
    printfn "paket already exists" 

/// install.dependencies.fsx 

open System.IO 
printfn "Installing dependencies" 
System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 
#r "paket.exe" 

open Paket 
let dependencies = Paket.Dependencies.Locate(__SOURCE_DIRECTORY__) 

printfn "%s" dependencies.DependenciesFile 

if not (File.Exists "packages/Newtonsoft.Json/lib/net40/Newtonsoft.Json.dll") then 
    printfn "installing nuget depenencies" 
    // either use the dependencies.Install to add dependencies in the paket.dependencies file 
    //dependencies.Install true |> ignore 
    // or install them by name 
    // I remove the existing versions 
    dependencies.Remove "FSharp.Data" 
    dependencies.Remove "Newtonsoft.Json 8.0.3" 
    // then add them (because I'm pedantic about the way the dependencies file looks) 
    dependencies.Add "FSharp.Data" 
    dependencies.Add "Newtonsoft.Json 8.0.3" 
    printfn "nuget depenencies installed" 
else 
    printfn "nuget depenencies already exist" 

printfn "Dependencies installed" 

주 Newtonsoft.Json에 대한 8.0.3의 사용은, 최신 버전은 20 추가 종속성을 제공합니다, 그래서 포함 된 매우 자기의 멋진 이전 버전을 발견했습니다. 최신 버전을 원하면 버전 번호를 남겨 둘 수 있습니다.

그런 다음 나는

System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 
#load "install.paket.fsx" 
#load "install.dependencies.fsx" 

#r "packages/fsharp.data/lib/net40/fsharp.data.dll" 
#r "packages/Newtonsoft.Json/lib/net40/Newtonsoft.Json.dll" 

open FSharp.Data 
open FSharp.Data.HtmlAttribute 
open FSharp.Data.HtmlNode 
open FSharp.Data.HttpRequestHeaders 
open Newtonsoft.Json 
open System.Net 
open System.IO 
// utilities like authentication, Http requests and JSON (de)serialization 

마지막으로, 난 그냥로드 유틸리티에서 내 목표 스크립트 전체를 많이 참조하는 재사용 가능한 기능을 공유 utilities.fsx에서 이러한 스크립트를 사용하여 :

System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__ 
#load "utilities.fsx" 
open Utilities 

하는 모든 의존성을 처리합니다. 이들은 Alt + Enter 키 조합 또는 명령 행에서 fsi.exe MyScript.fsx과 함께 Visual Studio에서 실행할 수 있습니다.

관련 문제