在文件上重新加载Suave应用程序保存

时间:2016-04-22 19:44:48

标签: .net f# suave

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

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

2 个答案:

答案 0 :(得分:4)

F# Snippets project的构建脚本就是这样做的。

您的想法是,您拥有app.fsx文件,用于定义名为WebPart的顶级app。您可以看到F# Snippets here的示例。 app.fsx脚本文件也可以加载其他文件,因此您可以以任何方式构建应用程序。

build.fsx build script然后启动服务器, 监视源代码和app.fsx的文件系统更改,并在后台使用F# Compiler Service重新加载它,并将“当前加载的”服务器替换为从新app值获取的服务器。

当前构建脚本的唯一限制是它无法正确地重新安装内存(它可能应该通过在构建脚本中重新创建F#交互式会话来修复),因此在重新加载后会耗尽内存。但是,它仍然使工作流程更加出色!

答案 1 :(得分:1)

我使用与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()
)