【问题标题】:Does FSI deal well with multi module F# projects?FSI 能否很好地处理多模块 F# 项目?
【发布时间】:2011-08-30 22:53:08
【问题描述】:

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

【问题讨论】:

    标签: .net f# fsi


    【解决方案1】:

    这个错误是因为你没有加载文件——它对我来说很好

     $ 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
    
    > 
    

    【讨论】:

    • 啊,谢谢。但难道没有什么更容易的吗?我的意思是,假设我有一个打开 5、6 个模块的大文件。更好的是,想象一下我有一个大项目,我想在文件 X 中运行几个函数,在文件 Y 中运行几个函数,等等。如果我必须手动加载每个文件使用的每个文件,它真的很容易让人厌烦。我想一定有其他方法可以实现这一目标..?除非 F# 的目的只是单个文件“项目”,否则我觉得这非常尴尬。 (顺便说一句,我正在使用 Visual Studio 中的 FSI)。
    • @devoured - 你可以编写一个 script.fsx 文件,内容为#load "module.fs";; 以轻松加载文件
    • 问题是我看不到在所描述的方法中 easy 是什么。请参阅我的原始帖子的编辑。
    • @devoured 真正的问题是如果你有很多文件,包含文件的顺序会对输出产生影响(考虑两个文件,它们都定义了一个添加函数)。因此,Visual Studio 不可能以正确的顺序执行此操作。另一种方法是将所有内容编译为 dll/exe,然后您可以使用 #r... 加载 DLL,每个 dll 只需 1 次调用,可能有多个文件
    • @devouredelysium 如果您使用 VSCode 并安装了 Ionide-fsharp 扩展,您可以从 Ctrl+Shift+P 菜单中选择“FSI:生成脚本文件...”选项,然后使用所有正确的 #r#load 指令为您创建一个 fsx 文件,这非常方便。
    【解决方案2】:

    有几个选项,其中一些已经被 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 中编写 #r "MyLib.dll(或在 fsx 脚本文件中)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        首先从 FSI 运行它以加载您的代码。

        【讨论】:

          猜你喜欢
          • 2012-06-01
          • 1970-01-01
          • 2015-02-09
          • 2011-12-24
          • 2010-12-12
          • 1970-01-01
          • 2017-03-29
          • 2014-08-17
          • 1970-01-01
          相关资源
          最近更新 更多