为什么会出现F#错误FS0039:未定义名称空间或模块'Http' [英] Why am I getting F# error FS0039: The namespace or module 'Http' is not defined
问题描述
在Visual Studio 2015和2017中,我正在FSharp Interactive的多个F#示例中尝试Http类,并且不断得到:
In Visual Studio 2015 and 2017, I'm trying out the Http class from several F# examples in FSharp Interactive, and I keep getting:
错误FS0039:未定义名称空间或模块'Http'
error FS0039: The namespace or module 'Http' is not defined
这是示例:
open FSharp.Data
let response = Http.RequestString("http://api.themoviedb.org/3/search/movie", silentHttpErrors = true)
这显然是由于FSharp.Data的版本所致.有没有办法为FSharp Interactive指定正确的版本?哪个版本的FSharp.Data包含Http模块?
This is clearly due to the version of FSharp.Data. Is there a way to specify the correct version for FSharp Interactive? What version of FSharp.Data contains the Http module?
推荐答案
基于注释,我整理了一个脚本来安装Paket,对其进行初始化,然后在运行脚本时选择安装依赖项.
Based on the comments, I put together a script to install Paket, intitialise it and then optionally install the dependencies whenever the script was run.
/// 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多个附加依赖项,因此我发现了一个很好的旧版本,该版本非常自包含.如果需要最新的版本,可以省略版本号.
Note the use of 8.0.3 for Newtonsoft.Json, The latest version brings over 20 additional dependencies, so I've found a nice old version that's very self contained. You may leave the version number out if you want the latest.
然后,我在共享的Utility.fsx中使用这些脚本以实现可重复使用的功能
Then, I use these scripts in a shared utilities.fsx for reusable functionality
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
最后,我只是通过加载实用程序来在目标脚本中引用全部内容:
Finally, I reference the whole lot in my target script by just loading utilities:
System.Environment.CurrentDirectory <- __SOURCE_DIRECTORY__
#load "utilities.fsx"
open Utilities
负责所有依赖项.可以使用Alt
+ Enter
组合键在Visual Studio中运行这些命令,也可以使用fsi.exe MyScript.fsx
which takes care of all the dependencies. These can be run from Visual studio with the Alt
+ Enter
key combination or from the command line with fsi.exe MyScript.fsx
这篇关于为什么会出现F#错误FS0039:未定义名称空间或模块'Http'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!