Перезагрузить 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()
)