F#Interactive,NuGet和外部库

时间:2015-11-07 01:40:20

标签: macos xamarin f# nuget suave

我试图在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上运行?

1 个答案:

答案 0 :(得分:4)

构建代码时,有关引用的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执行此脚本文件。

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