F# Interactive、NuGet 和外部库

F# Interactive, NuGet, and External libraries

我正尝试在 OS X El Capitan 上 运行 Xamarin Studio 5.9.8 中 suave(网络服务器)的演示代码。

module ServerTest =
    open Suave                 // always open suave
    open Suave.Http.Successful // for OK-result
    open Suave.Web             // for config

    startWebServer defaultConfig (OK "Hello World!")

当我实际构建代码时,它按预期工作。但是,当我尝试使用 ctrl + return 以交互方式 运行 连接它时,我收到错误 The namespace or module 'Suave' is not defined。我环顾四周,看起来 like it's possible to use libraries interactively with Visual Studio。有没有办法让它在 OS X 上运行?

构建代码时,有关引用的 DLL 的信息不包含在代码本身中,而是包含在其他地方(项目文件)。 但是当你在 FSI 中执行代码时,FSI 看到的只是代码。它没有可从中获取引用的项目文件。

但由于 FSI 仍然需要偶尔加载引用的 DLL(否则,它不会很有用),它提供了一种在代码中对它们进行编码的方法。这种方式被描述为 in the page you linked - 具体来说,#r 指令。

不幸的是,当您使用编译器构建代码时,不支持这些指令。编译器在看到它们时会产生错误。

因此您似乎有一个选择:要么使用 FSI 执行代码,要么使用编译器构建它。两者不能使用相同的代码。

幸运的是,有一些技巧可以解决这个问题。

首先,您可以利用一个名为 INTERACTIVE 的特殊条件编译变量并将 #r 指令放在 #if 中,这样只有FSI 会看到它,但编译器不会:

#if INTERACTIVE
   #r "./path/to/my.dll"
#endif

其次,您可以创建一个单独的脚本文件来加载引用,然后加载您的实际代码文件:

#r "./path/to/my.dll"
#load "./my_code.fs"

然后用FSI执行这个脚本文件。

在这两种情况下,路径都是相对于脚本文件的。
这意味着您收到的 "not found" 错误可能是由于 Suave DLL 的路径不正确造成的。我严重怀疑 DLL 是否与代码文件位于同一目录中。而且它没有扩展名。