2013-10-23 11 views
5

Io uso sbt nel modo seguente: eseguo ~ test:compile in sbt e poi lavoro in IDE, osservando occasionalmente se il progetto è ancora compilato, perché il compilatore di presentazioni IDE tende a essere bacato. Quando ho il codice git pull, potrebbero esserci dei cambiamenti nei file project/, quindi voglio ricaricare. C'è un modo, come guardare sia i file di origine che i file di progetto, quindi quando c'è un cambiamento nei file di progetto, ottengo effettivamente l'aggiornamento?Guarda per i file di progetto anche

risposta

3

Si può effettivamente non utilizzare ~ <task> e farlo ricostruire il progetto stesso in questo momento, perché ~ <task> ha bisogno di leggere la definizione di compilazione in sé a determinare:

  1. file quale fonte di guardare
  2. Come eseguire l'obiettivo.

Quello che stai facendo è modificare la configurazione del progetto/modifiche. Ciò richiede un completo reload o reboot di sbt per inserire la nuova configurazione.

Quindi, a partire da 0.13 sbt, questo non è possibile. È possibile possibile farlo ricostruire il codice sorgente quando si modifica project/, ma senza ricostruire la definizione di build, non molto aiuto.

È possibile creare un nuovo prompt sbt, o attività, che durante l'esecuzione potrebbe verificare se i file di origine in progetto/sono aggiornati e emettere un avviso/errore in modo da sapere il riavvio. Questa è probabilmente l'opzione migliore in questo momento.

+1

È possibile guardare la cartella del progetto per il cambiamento e lasciare che SBT si chiuda con garbo? – Schleichardt

6

Come jsuereth ha spiegato che questa non è un'attività che SBT può gestire in 1 istanza. Quello che è richiesto è un riavvio di SBT per interrompere il processo di visione e ricaricare la propria configurazione.

Il seguente script Scala fa esattamente questo, utilizza Java NIO WatchService e Scala Process per monitorare un percorso e riavviare un processo. Il codice dovrebbe essere abbastanza semplice da capire:

#!/usr/bin/env scala 

import java.nio.file._ 
import scala.collection.JavaConversions._ 
import scala.sys.process._ 

val file = Paths.get(args(0)) 
val cmd = args(1) 
val watcher = FileSystems.getDefault.newWatchService 

file.register(
    watcher, 
    StandardWatchEventKinds.ENTRY_CREATE, 
    StandardWatchEventKinds.ENTRY_MODIFY, 
    StandardWatchEventKinds.ENTRY_DELETE 
) 

def exec = cmd run true 

@scala.annotation.tailrec 
def watch(proc: Process): Unit = { 
    val key = watcher.take 
    val events = key.pollEvents 

    val newProc = 
    if (!events.isEmpty) { 
     proc.destroy() 
     exec 
    } else proc 

    if (key.reset) watch(newProc) 
    else println("aborted") 
} 

watch(exec) 

uso nella vostra dir SBT sarebbe:

watchr.scala project/ "sbt ~ test:compile" 

Se qualcosa non è chiaro, non esitate a chiedere, ovviamente qualsiasi linguaggio di scripting potrebbe essere utilizzato per implementare questo comportamento.

Problemi correlati