我最近开始使用Suave;我使用yeoman和F#生成器设置了一个项目。要运行应用程序,我使用Fake构建可执行文件然后运行它。每当我更改任何应用程序文件,即* .fs文件时,我都必须重复构建和运行可执行文件的过程。
是否有更好的开发流程,其中应用程序在文件保存时重建或重新加载/重新启动?
答案 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()
)