FSI是否能很好地处理多模块F#项目?

时间:2011-08-30 06:05:32

标签: .net f# fsi

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原则?

4 个答案:

答案 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

    < / LI>

答案 2 :(得分:2)

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

答案 3 :(得分:0)

创建一个开始的.fsx文件:

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

首先从FSI运行它以获取代码。