Загрузка модулей F# не из текущего каталога

Я пишу простое консольное приложение F# с Visual Studio 2017, ориентированное на .NET Core 2.0. Мне интересно, возможно ли open модуль, отсутствующий в текущем каталоге.

Например :

/root/foo.fs /root/SubDirectory/bar.fs

Как bar.fs открыть модуль Foo или наоборот?

Я уже пробовал:

open Foo
open "../Foo"
open "C:/AbsolutePath/Foo"

С двумя последними VS пожаловался:

FS0010 : Неожиданный строковый литерал в объявлении open. Ожидаемый идентификатор, «глобальный» или другой токен.

Документов по этому поводу вроде бы нет.

Любая помощь будет оценена по достоинству.


person Wingjam    schedule 16.02.2018    source источник
comment
Вы не можете open файлы, только модули и пространства имен, объявленные в файлах, перечисленных перед текущим файлом в вашем .fsproj. В VS2017 вы должны иметь возможность создать проект или добавить эти файлы в существующий проект и изменить порядок файлов.   -  person TheQuickBrownFox    schedule 16.02.2018
comment
Он работает по-другому в контексте скрипта F#, где вы можете использовать директиву #load для добавления других файлов на основе их пути.   -  person TheQuickBrownFox    schedule 16.02.2018


Ответы (1)


На самом деле вы можете добавлять или изменять порядок файлов в VS2017 только в предварительной версии, я полагаю (пока еще не в 15.5.6). Но TheQuickBrownFox прав, файл с вашим модулем должен быть в файле fsproj, и порядок важен.

Для VSCode вы можете использовать Command (или Project Explorer) в Ionide: Ctrl+Shift+P: F#: Add Current File to Project, а также F#: Move File Up/Down (также есть меню правой кнопкой мыши в F# Project Explorer.

В Visual Studio 2017 вы можете щелкнуть проект правой кнопкой мыши и выбрать Edit .fsproj. VS автоматически перезагрузит файл при сохранении, поэтому нет необходимости выгружать проект, как в VS2015. Это будет выглядеть примерно так:

введите здесь описание изображения

Вы можете видеть, что MyModule.fs находится в корне проекта, а строка с MyModule.fs должна быть над любыми другими файлами, которые на нее ссылаются. Вы можете использовать Alt+стрелку вверх/вниз для перемещения строк.

введите здесь описание изображения

Тогда вы можете просто открыть этот модуль и использовать его. Например, в этом модуле определено Add.

введите здесь описание изображения

Еще я добавил директиву #load, это только если вы хотите протестировать ее в FSI, а компилятор ее проигнорирует.

person s952163    schedule 16.02.2018