2014-06-11 12 views
9

Mi piacerebbe eseguire un comando shell - rm -r una directory - ogni volta che il mio progetto sbt si costruisce. Questo sarebbe prima di compile.Come eseguire il comando di shell prima di compilare l'attività?

Ragionamento: c'è un file di cache che non viene mai aggiornato. Se lo elimini prima di ogni compilazione, forza l'aggiornamento.

Si prega di avvisare.

+0

Sì. L'ho upvoted per chiarezza, e appena segnato come risposta dopo aver verificato anche la funzionalità. Esattamente quello che stavo cercando, grazie! –

risposta

13

È possibile creare un'attività che elimina il file:

val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file") 
val removeCacheSettings = removeCacheTask := { 
    import sys.process._ 
    Seq("rm", "/path/to/file") ! 
} 

Poi richiedono che il compito essere eseguito prima della compilazione con l'aggiunta di queste impostazioni al progetto:

Project(...).settings(
    removeCacheSettings, 
    compile in Compile <<= (compile in Compile).dependsOn(removeCacheTask) 
) 

Fonte: https://groups.google.com/forum/#!topic/play-framework/4DMWSTNM4kQ


In build.sbt sarebbe simile a questo:

lazy val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file") 

removeCacheTask := { 
    import sys.process._ 
    Seq("rm", "/path/to/file")! 
} 

compile in Compile <<= (compile in Compile).dependsOn(removeCacheTask) 
+1

Questo è un vero toccasana! Penso che questo dovrebbe essere nei documenti di Play – acjay

+1

Si noti che se si desidera fare riferimento all'attività in un sottoprogetto, è necessario fornire un ambito o l'attività non verrà trovata nel sottoprogetto. Il metodo più semplice per scrivere è 'removeCacheTask in Global: = {...}' –

6

@LimbSoup answer va bene, ma ci sono alcuni miglioramenti da considerare.

Il comando da eseguire rm potrebbero non essere disponibili su altri sistemi operativi non rm, come Windows, quindi è molto più sicuro da usare sbt.IO.delete metodo.

Poiché si tratta dell'eliminazione di file, c'è l'attività clean che si basa sul metodo def doClean(clean: Seq[File], preserve: Seq[File]): Unit (da sbt.Defaults) e con le modifiche appropriate potrebbe anche essere di aiuto. Penso che richiederebbe una nuova configurazione, però.

Vedere How to exclude files in a custom clean task? per alcune indicazioni relative all'attività personalizzata clean.

+0

Ho implementato la risposta, sopra, e funziona perfettamente. Ora sto esaminando la tua espansione, quindi ti ringrazio anche per questo! –

Problemi correlati