FSI能很好地处理多模块F#项目吗



FSI能很好地处理多模块/文件F#项目吗?考虑以下项目:

模块.fs:

module Xyz
let add x y = x + y

程序.fs:

module Program
open Xyz    
let result = add 1 2

选择并运行Program.fs的最后2行将产生以下FSI错误:

Program.fs: error FS0039: The namespace or module 'Xyz' is not defined

这里有什么问题?


所以,假设我有以下项目结构:

A.fs
B.fs
C.fs
D.fs
E.fs

我想运行E.fs的一些函数。E.fs使用了所有其他的.fs文件,所以我为它们中的每一个都有一个open。如果以后我还想从其他任何一个文件中运行一些代码,那么我必须对以前不是#loaded的任何文件重复这个过程。

根据你的建议,似乎要让我的E.fs文件在FSI上运行,我要么必须创建一个单独的.fsx文件,要么有一个独立的

#if INTERACTIVE
#load "..."

对于我将使用的每个模块,这是IMO非常多余的。我是在这里遗漏了什么,还是这明显违反了KISS和DRY原则?

错误将是因为您没有加载文件-它对我进行很好

 $ fsi --load:module.fs --load:Program.fs
Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
[Loading /suphys/jpal8929/fsbug/module.fs
 Loading /suphys/jpal8929/fsbug/Program.fs]
namespace FSI_0002
  val add : int -> int -> int

namespace FSI_0002
  val result : int
> 

有几个选项,其中一些已经被Brian和jpalmer提到,所以我只想总结一下:

  • 如果你只有几个文件,那么你可以"加载"它们,这意味着源代码被发送到F#Interactive,并在FSI控制台中编译。如果你想测试一个更大项目的一部分,这种方法很有用。

    要执行此操作,您可以使用--load:file.fs命令行选项,也可以在F#Interactive中写入#load "file.fs"(或在使用--load发送给F#Interactive的Script.fsx文件中(。要管理更多的文件,您可以编写一个脚本Load.fsx来加载所需的所有文件。

  • 如果你有一个更大的项目(例如一个库(,并且想使用它或从F#Interactive测试它,那么你可以使用fsc.exe编译库,从F#Interactive引用它,并从控制台使用它的公共类型/函数

    为此,您可以使用-r:MyLib.dll命令行选项,也可以在F#Interactive(或fsx脚本文件(中编写#r "MyLib.dll

您知道#load吗?您知道#r(在将其他代码编译成DLL之后(吗?http://msdn.microsoft.com/en-us/library/dd233175.aspx

创建一个以开头的.fsx文件

#load "module.fs" "Program.fs"

并首先从FSI运行它来加载代码。

相关内容

  • 没有找到相关文章