2016-04-22 12 views
5

Ho recentemente iniziato con Suave; Ho impostato un progetto usando yeoman e il generatore F #. Per eseguire l'app, costruisco un eseguibile utilizzando Fake e quindi eseguilo. Ogni volta che cambio uno qualsiasi dei file dell'app, cioè i file * .fs, devo ripetere il processo di creazione ed esecuzione di un eseguibile.Reload Suave App su File Salva

Esiste un processo migliore per lo sviluppo, in cui l'app si ricompone o si ricarica/si riavvia al salvataggio del file?

+0

script di build di FsReveal fa questo: https://github.com/fsprojects/FsReveal/blob/master/build.fsx – Foole

risposta

4

Lo script di compilazione per il F# Snippets project fa esattamente questo.

L'idea è di disporre del file app.fsx che definisce un livello superiore WebPart denominato app. È possibile vedere l'esempio per F# Snippets here. Il file di script app.fsx può anche caricare altri file, in modo da poter strutturare l'applicazione in qualsiasi modo.

Il build.fsxbuild script quindi avvia un server, il file monitora i cambiamenti di sistema per il codice sorgente e app.fsx e ricarica utilizzando F# Compiler Service in background e sostituisce il server "attualmente caricata" con quello ottenuto dal nuovo valore app.

L'unica limitazione dello script di build corrente è che non riporta correttamente la memoria (probabilmente dovrebbe essere riparata ricreando F # Interactive Session nello script di build) e quindi esaurisce la memoria dopo un maggior numero di ricariche. Ma ancora, rende il flusso di lavoro molto più bello!

+0

A quanto mi risulta, in alternativa è quella di utilizzare i file di script (.fsx). Esiste un percorso di migrazione "best practice" da un'apposita app per script a una compilata? – Ari

+0

È possibile impostare il progetto in modo che funzioni in entrambe le direzioni. Vedere https://github.com/fssnippets/fssnip-website per esempio. –

1

Io uso un approccio simile a Tomas ma eseguo il server in un processo figlio dello script di compilazione. Questo rende il riavvio un po 'più lento per il riavvio, ma non perde alcuna memoria o porte. Questo mi consente anche di usare facilmente una directory di lavoro diversa per i miei script di compilazione rispetto ai miei script di app (in questo caso ./app).

Ecco una versione ridotta del mio script 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() 
)