FSI是否能很好地处理多模块/文件F#项目? 考虑以下项目:
module.fs:
module Xyz
let add x y = x + y
Program.fs:
module Program
open Xyz
let result = add 1 2
选择并运行Program.fs
的最后两行将产生以下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原则?
答案 0 :(得分:4)
错误将是因为你没有加载文件 - 它对我来说很好
$ 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
>
答案 1 :(得分:3)
有一些选项,其中一些已经由Brian和jpalmer提到过,所以我只想总结一下:
如果你只有几个文件,那么你可以“加载”它们,这意味着源被发送到F#Interactive并在FSI控制台中编译。如果要测试较大项目的一部分,此方法很有用。
要执行此操作,您可以使用--load:file.fs
命令行选项,也可以在F#Interactive中编写#load "file.fs"
(或使用{{发送到F#Interactive的Script.fsx
文件中编写--load
1}})。要管理更多文件,您可以编写一个脚本Load.fsx
来加载您需要的所有文件。
如果你有一个更大的项目(例如一个库)并想要使用它或从F#Interactive测试它,那么你可以使用fsc.exe
编译库,从F#Interactive引用它并使用它来自控制台的公共类型/功能
要执行此操作,您可以使用-r:MyLib.dll
命令行选项,也可以在F#Interactive(或#r "MyLib.dll
脚本文件)中编写fsx
。
答案 2 :(得分:2)
您知道#load
吗?你知道#r
(在将其他代码编译成DLL之后)吗? http://msdn.microsoft.com/en-us/library/dd233175.aspx
答案 3 :(得分:0)
创建一个开始的.fsx文件:
#load "module.fs" "Program.fs"
首先从FSI运行它以获取代码。