2013-08-01 7 views
5

Sarebbe possibile rendere reattivo Shake, usando inotify (o qualunque altro uso di git-annex e Yesod) in modo che, se mai il filesystem cambia in modo tale da implicare che la regola debba essere eseguita, lo fa alla prima occasione?Come posso utilizzare la libreria Shake per creare un sistema di build reattivo?

+4

Questa domanda sembra essere off-topic perché è una richiesta di funzionalità per Shake, non una domanda di programmazione. –

+2

@ PetrPudlák Interpreterei questa domanda come "come posso usare la libreria Shake per costruire un sistema di costruzione reattivo", poiché almeno una delle risposte non richiede nuove funzionalità. –

risposta

8

L'autore di Shake, Neil Mitchell, ha risposto questo dicendo:

ci sono alcuni modi per affrontare questo:

  1. Si potrebbe semplicemente eseguire nuovamente agitare ogni volta che rileva qualcosa è cambiato . Shake è altamente ottimizzato per ricostruzioni veloci, se la modifica richiede una compilazione, quindi il tempo di Shake per capire che cosa è da ricostruire è probabilmente minimo. Non richiede modifiche a Shake.

  2. Ci sono alcune cose che Shake fa all'avvio, come leggere il database di scuotimento . Se c'è una domanda, e si scopre che sia visibile in tempo, fornirei volentieri una nuova agitazione a buon mercato API di qualche tipo - non è così difficile da fare.

  3. Quando Shake esegue un controllo di ricostruzione, la cosa più costosa è che controlla i tempi di modifica del file. Se il layer inotify ha fornito un elenco di di file che sono stati modificati, è stato possibile ricontrollare solo le cose che erano state modificate da . Per un progetto di grandi dimensioni è probabile che vedrai ~ 1s controllando i tempi di modifica, quindi probabilmente ti comprerà un po ', e non è troppo difficile da implementare.

  4. Se Agitare è attivamente costruendo, e poi qualcosa cambia, si potrebbe generare un'eccezione, uccidere tutto ciò che è in fase di costruzione, e riavviare Shake. L'agitazione è stata accuratamente testata con le eccezioni lanciate allo e fa la cosa giusta. So che almeno una persona usa Shake in questo modo.

  5. Infine, se Shake si sta sviluppando attivamente, è possibile dinamicamente terminare solo quelle regole i cui input sono cambiati e andare di nuovo. Shake potrebbe supportare questo modello, ma sarebbe una quantità ragionevole di e richiedere la riprogettazione di alcuni pezzi. Quello sarebbe il modello reattivo completo , ma ho il sospetto che possa essere un vantaggio solo quando hai un numero enorme di file e alcuni file stanno cambiando quasi a continuamente ma la maggior parte dei file non lo è.

Abbiamo anche determinato che la combinazione Agitare con un programma di utilità come Hobbes (anche Hackage) può permettere di fare reattivo build.

+1

Uso Shake come build manager e il passaggio 2 occupa circa 300 ms per me, che è troppo lento per qualsiasi approccio di polling automatico ragionevole. – nominolo

+0

@nominolo Se è importante per te, fammi sapere, e io rifaremo l'API per evitare il sovraccarico con la riesecuzione. Se hai un profilo Haskell per il tuo caso d'uso, mi piacerebbe vederlo, poiché potrebbe identificare qualcos'altro in colpa nei 300 ms. –

Problemi correlati