重新加载Suave应用程序文件保存
我最近开始与Suave;我使用yeoman和F#生成器设置了一个项目。要运行该应用程序,我使用Fake构建可执行文件,然后运行它。无论何时我更改任何应用程序文件,即* .fs文件,我都必须重复构建和运行可执行文件的过程。重新加载Suave应用程序文件保存
是否有更好的开发过程,其中的应用程序重建或重新加载/重新启动文件保存?
F# Snippets project的构建脚本正是如此。
这个想法是,你有app.fsx
文件,它定义了名为app
的顶级WebPart
。你可以看到F# Snippets here的例子。 app.fsx
脚本文件也可以加载其他文件,因此您可以以任何您需要的方式构建应用程序。
的build.fsx
build script然后启动服务器, 监视文件的源代码并app.fsx
系统的变化和它使用的背景F# Compiler Service和替换从新app
值获得一个“当前加载的”服务器重新加载。
当前构建脚本的唯一限制是它没有正确地重新定位内存(它应该可以通过在构建脚本中重新创建F#交互式会话来解决),因此在大量重新加载后内存不足。但是,它仍然使工作流程更加美好!
据我了解,另一种是使用脚本文件(.fsx)。是否存在从脚本应用程序到编译应用程序的“最佳实践”迁移路径? – Ari
您可以设置项目以双向工作。例如,请参阅https://github.com/fssnippets/fssnip-website。 –
我对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()
)
FsReveal的生成脚本做到这一点:https://github.com/fsprojects/FsReveal/blob/master/build.fsx – Foole