Хорошо ли работает FSI с многомодульными проектами F #? - PullRequest
2 голосов
/ 30 августа 2011

Хорошо ли работает FSI с многомодульными / файловыми проектами F #? Рассмотрим следующий проект:

module.fs:

module Xyz

let add x y = x + y

Program.fs:

module Program

open Xyz    
let result = add 1 2

Выбор и запуск последних 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 ]

4 голосов
/ 30 августа 2011

Ошибка будет из-за того, что вы не загрузили файл - он отлично работает для меня, делая

 $ 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

> 
3 голосов
/ 30 августа 2011

Есть несколько вариантов, некоторые из которых уже упоминались Брайаном и Джпалмером, поэтому я просто попытаюсь обобщить:

  • Если у вас есть всего несколько файлов, вы можете «загрузить» их, что означает, что источник отправляется в F # Interactive и компилируется в консоли FSI. Этот подход полезен, если вы хотите протестировать часть более крупного проекта.

    Для этого вы можете использовать параметр командной строки --load:file.fs или написать #load "file.fs" в F # Interactive (или в файле Script.fsx, который отправляется в F # Interactive с использованием --load). Для управления другими файлами вы можете написать скрипт Load.fsx, который загружает все нужные вам файлы.

  • Если у вас более крупный проект (например, библиотека) и вы хотите использовать его или протестировать из F # Interactive, то вы можете скомпилировать библиотеку, используя fsc.exe, ссылаться на нее из F # Interactive и использовать ее открытые типы / функции из консоли

    Для этого вы можете либо использовать опцию командной строки -r:MyLib.dll, либо написать #r "MyLib.dll в F # Interactive (или в файле сценария fsx).

2 голосов
/ 30 августа 2011

Вам известно о #load?Вам известно о #r (после компиляции другого кода в DLL)?http://msdn.microsoft.com/en-us/library/dd233175.aspx

0 голосов
/ 30 августа 2011

Создайте файл .fsx, который начинается:

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

и сначала запустите его из FSI, чтобы загрузить код.

...