在文件保存时重新加载 suave 应用程序



我最近开始使用Suave;我使用 yeoman 和 F# 生成器设置了一个项目。为了运行该应用程序,我使用 Fake 构建了一个可执行文件,然后运行它。每当我更改任何应用程序文件(即 *.fs 文件)时,我都必须重复构建和运行可执行文件的过程。

是否有更好的开发过程,其中应用程序在文件保存时重建或重新加载/重新启动?

F# 代码段项目的生成脚本正是这样做的。

这个想法是,您app.fsx文件定义了名为 app 的顶级WebPart。可在此处查看 F# 代码段的示例。app.fsx脚本文件还可以加载其他文件,因此您可以根据需要的任何方式构建应用程序。

然后,build.fsx构建脚本启动服务器,监视源代码的文件系统更改,并在后台使用 F# 编译器服务app.fsx并重新加载它,并将"当前加载"的服务器替换为从新app值获取的服务器。

当前生成脚本

的唯一限制是它不能正确重新调整内存(可能应该通过在生成脚本中重新创建 F# 交互式会话来修复),因此在大量重新加载后内存不足。但是,它仍然使工作流程更好!

我使用与 Tomas 类似的方法,但在构建脚本的子进程中运行服务器。 这使得重新启动速度稍慢,但不会泄漏任何内存或端口。 这也使我可以轻松地为我的构建脚本与应用程序脚本(在本例中为 ./app)使用不同的工作目录。

这是我的假脚本的精简版本。

#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()
)

最新更新