6

I've recently started with Suave; I setup a project using yeoman and the F# generator. To run the app, I build an executable using Fake and then run it. Whenever I change any of the app files, i.e. *.fs files, I have to repeat the process of building and running an executable.

Is there a better process for development, wherein the app rebuilds or reloads/restarts on file save?

4

2 回答 2

4

F# Snippets 项目的构建脚本正是这样做的。

这个想法是你有app.fsx一个定义顶级WebPart名称的文件app。您可以在此处查看 F# Snippets的示例。脚本文件还可以加载其他文件,因此您可以按照app.fsx您需要的任何方式构建您的应用程序。

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

当前构建脚本的唯一限制是它不能正确释放内存(它可能应该通过在构建脚本中重新创建 F# Interactive Session 来修复),因此在大量重新加载后它会耗尽内存。但是,它仍然使工作流程变得更好!

于 2016-04-22T23:26:56.153 回答
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()
)
于 2016-05-10T15:19:17.873 回答