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运行它来加载代码。