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

问题描述:

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

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

+0

FsReveal的生成脚本做到这一点:https://github.com/fsprojects/FsReveal/blob/master/build.fsx – Foole

F# Snippets project的构建脚本正是如此。

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

build.fsxbuild script然后启动服务器, 监视文件的源代码并app.fsx系统的变化和它使用的背景F# Compiler Service和替换从新app值获得一个“当前加载的”服务器重新加载。

当前构建脚本的唯一限制是它没有正确地重新定位内存(它应该可以通过在构建脚本中重新创建F#交互式会话来解决),因此在大量重新加载后内存不足。但是,它仍然使工作流程更加美好!

+0

据我了解,另一种是使用脚本文件(.fsx)。是否存在从脚本应用程序到编译应用程序的“最佳实践”迁移路径? – Ari

+0

您可以设置项目以双向工作。例如,请参阅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() 
)