如何在VSCode中包含F#的Akka.net框架

问题描述

我正在尝试使用我在互联网上找到的该示例,将Akka.NET用于VSCode中的F#。

代码

// ActorSayHello.fsx
#time "on"
// #load "Bootstrap.fsx"

open System
open Akka.Actor
open Akka.Configuration
open Akka.FSharp
open Akka.TestKit

// #Using Actor
// Actors are one of Akka's concurrent models.
// An Actor is a like a thread instance with a mailBox. 
// It can be created with system.ActorOf: use receive to get a message,and <! to send a message.
// This example is an EchoServer which can receive messages then print them.

let system = ActorSystem.Create("FSharp")

type EchoServer =
    inherit Actor

    override x.OnReceive message =
        match message with
        | :? string as msg -> printfn "Hello %s" msg
        | _ ->  failwith "unkNown message"

let echoServer = system.ActorOf(Props(typedefof<EchoServer>,Array.empty))

echoServer <! "F#!"

system.Shutdown()

但我收到此错误 ActorSayHello.fsx(6,6): error FS0039: The namespace or module 'Akka' is not defined.

我已经在VScode中配置了ionide插件,并且能够在没有Akka.NET的情况下运行F#。我使用以下命令安装了Akka.NET

dotnet add package Akka.FSharp --version 1.4.10

添加的库已自动添加.fsproj文件中。这是命令的输出

docs

任何帮助将不胜感激。谢谢!

解决方法

由于您正在使用脚本文件,因此它不包含任何项目引用。 相反,您可以直接从脚本中使用nuget引用!

#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit" 

可能发生的另一个警告是F#交互需要一个--langversion:preview标志才能使用nuget引用。在VSCode "FSharp.fsiExtraParameters": ["--langversion:preview"]中设置settings.json对我有用。

最后要进行编译的地方是将system.Shutdown()替换为system.Terminate(),因为Shutdown方法已被弃用并删除。

以下是带有上述更改的完整列表:

// ActorSayHello.fsx
#time "on"
#r "nuget: Akka.FSharp" 
#r "nuget: Akka.TestKit" 
// #load "Bootstrap.fsx"

open System
open Akka.Actor
open Akka.Configuration
open Akka.FSharp
open Akka.TestKit

// #Using Actor
// Actors are one of Akka's concurrent models.
// An Actor is a like a thread instance with a mailbox. 
// It can be created with system.ActorOf: use receive to get a message,and <! to send a message.
// This example is an EchoServer which can receive messages then print them.

let system = ActorSystem.Create("FSharp")

type EchoServer =
    inherit Actor

    override x.OnReceive message =
        match message with
        | :? string as msg -> printfn "Hello %s" msg
        | _ ->  failwith "unknown message"

let echoServer = system.ActorOf(Props(typedefof<EchoServer>,Array.empty))

echoServer <! "F#!"

system.Terminate()

结果在我的机器上如下所示:

Real: 00:00:00.000,ЦП: 00:00:00.000,GC gen0: 0,gen1: 0,gen2: 0
namespace FSI_0012.Project

Hello F#!
Real: 00:00:00.007,GC gen0: 1,gen2: 0
val system : ActorSystem = akka://FSharp
type EchoServer =
  class
    inherit Actor
    override OnReceive : message:obj -> unit
  end
val echoServer : IActorRef = [akka://FSharp/user/$a#989929929]
val it : Threading.Tasks.Task