В прошлый раз мы создали проект F# вручную. Посмотреть этот пост здесь. Это помогает понять, как работают проекты. Но если вам приходится делать это каждый раз, это становится очень скучным. Давайте делегируем создание проектов инструменту dotnet, который мы ранее использовали для запуска нашего проекта. Загрузите последнюю версию .NET core SDK здесь. На момент написания статьи версия 2.1.301.

dotnet --version
2.1.301

Прежде чем продолжить, убедитесь, что у вас установлена ​​последняя версия .NET core sdk. .NET core 2.1 — самая крутая версия. Но не верьте мне на слово. Подробнее читайте здесь, если хотите.

Хорошо, теперь, когда все настроено, перейдите в только что созданную папку. Дайте этой папке имя по вашему выбору. Я называю свой «Запуск». Научитесь создавать папки в командной строке/терминале. Это сделает вас быстрее. Если вы не знаете команд для создания новой папки на терминале, то помните, что поисковые системы — ваши друзья.

Файл состоит из кода

Проект состоит из файлов

Решение состоит из проектов

В большинстве случаев код организован в несколько проектов. Таким образом, связанный код существует в отдельном проекте, а код, имеющий другую цель, может находиться в другом проекте. Это называется разделением ответственности. Даже если вы новичок в программировании, полезно думать в этих направлениях о важных принципах. Страница Википедии о разделении интересов находится здесь.

Решение находится на верхнем уровне в иерархии организации кода. Следующая команда создает решение. Перейдите к ранее созданной папке в командной строке. Давайте продолжим и создадим решение под названием «Запуск».

dotnet new sln --name Launch

Обратите внимание, что если вы не дадите ему имя, dotnet создаст решение с тем же именем, что и у папки.

Создайте новый консольный проект F#. Помните, что .NET поддерживает и другие языки. И проекты связаны с языком, на котором написаны их файлы. Так что мы бы также упомянули язык

dotnet new console --name launcher -lang F#

В приведенной выше команде мы отправили 2 аргумента. имя и яз. Аргументы обозначаются двойным дефисом. Обратите внимание, что если вы используете короткое имя для имени аргумента, вы используете один дефис. Каждому имени аргумента присваивается значение в приведенной выше команде. Аргументу имя присваивается значение средства запуска. Итак, консольный проект называется лаунчер. Аргументу языка присваивается значение F# по очевидным причинам.

Мы создали функцию обратного отсчета в Learning F# — Part 7 — rec. Давайте сделаем эту функцию частью библиотеки. В мире .NET это называется библиотекой классов. Выполните следующую команду, чтобы создать библиотеку.

dotnet new classlib --name countdown -lang F#

Это создаст проект для нашей библиотеки обратного отсчета. Все наши проекты созданы. Итак, моя папка Launch выглядит так

Теперь добавьте эти проекты в решение.

dotnet sln .\Launch.sln add .\launcher\launcher.fsproj .\countdown\countdown.fsproj

Давайте теперь отредактируем файлы fsharp. Я буду использовать редактор VS code. Вы можете использовать свой любимый редактор. Если вы хотите использовать intellisense/дополнение кода в редакторе VS Code, используйте расширение Ionide. Хотя расширение не является обязательным для этого упражнения.

В папке обратного отсчета переименуйте файл Library.fs в Counter.fs. Не забудьте также изменить имя в countdown.fsproj.

Здесь вы заметите, что в файле есть объявление пространства имен и модуль. Как мы видели ранее, программу F# можно физически сгруппировать в решения/проекты/файлы. пространства имен и модули представляют собой логическую группу кода F#. Проще говоря, пространство имен состоит из модулей. модули составляют значения. пространство имен и модули также могут содержать типы. Но мы еще не обсуждали типы, так что давайте вернемся к этому позже. Достаточно понять пространство имен и модуль для логической группировки кода. Подробнее об этом читайте здесь и здесь.

Мой файл Counter.fs имеет следующий код. Функция может быть вам знакома по последней части серии блогов. Обратите внимание, что здесь я не использую группировку пространства имен.

module Counter
 let rec countDown x =
  if x<=0 then 0
  else
   printf "%d\n" (x)
   countDown (x-1)

Теперь мы хотим, чтобы проект запуска использовал проект обратного отсчета. Это означает, что проект запуска должен ссылаться на проект обратного отсчета. Вот как вы это делаете: он добавляет ссылку на проект обратного отсчета в проект запуска.

dotnet add .\launcher\launcher.fsproj reference .\countdown\countdown.fsproj

Теперь отредактируйте Program.fs. Launcher proj — ваш основной проект, потому что у него есть точка входа.

open System
open Counter
[<EntryPoint>]
let main argv =
 let countedDownTo = (countDown 10)
  printf "T minus %d. Lift off!" countedDownTo
  0

В командной строке перейдите в папку, содержащую файл launcher.fsproj, и запустите приложение с помощью следующей команды.

dotnet run

Вы должны увидеть следующий результат

10
9
8
7
6
5
4
3
2
1
T minus 0. Lift off!

До скорого. Ваше здоровье.