Перезагрузить Suave App на файл Сохранить

Я недавно начал с Suave; Я настраиваю проект, используя yeoman и генератор F#. Чтобы запустить приложение, я создаю исполняемый файл с использованием Fake, а затем запускаю его. Всякий раз, когда я изменяю какие-либо файлы приложения, например файлы *.fs, мне приходится повторять процесс создания и запуска исполняемого файла.

Есть ли лучший процесс для разработки, при котором приложение перестраивает или перезагружает / перезапускает при сохранении файла?

2 ответа

Решение

Сценарий сборки для проекта F# Snippets делает именно это.

Идея в том, что у вас есть app.fsx файл, который определяет верхний уровень WebPart названный app, Вы можете увидеть пример для F# Snippets здесь. app.fsx Файл сценария также может загружать другие файлы, поэтому вы можете структурировать свое приложение любым удобным для вас способом.

build.fsx Затем скрипт сборки запускает сервер, отслеживает изменения файловой системы для вашего исходного кода и app.fsx и перезагружает его, используя F# Compiler Service в фоновом режиме, и заменяет "загруженный в данный момент" сервер сервером, полученным из нового app значение.

Единственным ограничением текущего сценария сборки является то, что он неправильно корректирует память (вероятно, это следует исправить путем воссоздания F# Interactive Session в сценарии сборки), и поэтому он исчерпывает память после большего числа перезагрузок. Но тем не менее, это делает рабочий процесс намного приятнее!

Я использую аналогичный подход к Tomas, но запускаю сервер в дочернем процессе сценария сборки. Это делает перезапуск немного медленнее, но не приводит к утечке памяти или портов. Это также позволяет мне легко использовать другой рабочий каталог для сценариев сборки по сравнению со сценариями приложения (в данном случае./app).

Вот урезанная версия моего скрипта FAKE.

#r "packages/FAKE/tools/FakeLib.dll"
open Fake

let wait() = System.Console.Read() |> ignore

let runServer () =
    fireAndForget (fun startInfo ->
        startInfo.WorkingDirectory <- "./app"
        startInfo.FileName <- FSIHelper.fsiPath
        startInfo.Arguments <- "--define:RELOAD server.fsx")


Target "Watch" (fun _ ->
  use watcher = !! "app/*.fsx" |> WatchChanges (fun changes ->
      tracefn "%A" changes
      killAllCreatedProcesses()
      runServer()
  )
  runServer()
  wait()
)
Другие вопросы по тегам