2013-03-04 6 views
5

Ich habe ein kurzes Bash-Skript, das auf meinen Scaladoc-Kommentaren einen Fund-and-Replacement-Vorgang durchführt, um Links zur externen Dokumentation einer Drittanbieter-Bibliothek zu generieren. Ich möchte, dass dieses Skript jedes Mal ausgeführt wird, wenn ich Scaladocs mit der Aufgabe doc erzeuge.Wie Bash-Skript nach dem Erzeugen von Scaladoc mit Doc-Task ausführen?

Wie kann ich das erreichen?

Antwort

5

Es ist eigentlich ziemlich einfach. Zuerst besichtigte ich doc, um zu sehen, was es war (inspect doc auf der sbt Prompt), bemerkte es eine Aufgabe war, und fuhr fort, eine Abhängigkeit von selbst auf build.sbt mit erklärt:

doc in Compile <<= doc in Compile map { (file) => 
    Seq("bash", "-c", "ls >tmp.log").! // CWD is sbt's current dir 
    file 
} 

Das Ding habe ich auszuführen bash ist die gleiche Bibliothek wie scala.sys.process, so können Sie Scaladoc for that nachschlagen. Dies wurde auf SBT 0.12.2 getestet, und ich denke, es könnte einen kleinen Unterschied auf SBT 0.11.x oder 0.10.x geben.

1

In sbt 0,13 und die neuesten Versionen der Anwendungsfall kann auch mit := und .value Makros erreicht werden (die beide zielen auf sein einfacher als <<=):

doc in Compile := { 
    val f = (doc in Compile).value 
    // execute a shell script if you want with sbt's Process API 
    // http://www.scala-sbt.org/0.13/docs/Process.html 
    val ec = (baseDirectory.value/"myBashScript.sh").getAbsolutePath ! 
    val log = streams.value.log 
    log.debug(s"Exit code: $ec") 
    f 
} 

Sie können auch mögen triggeredBy Methode für Aufgaben wie folgt:

lazy val runMyBashScriptTask = taskKey[Unit]("Run myBashScript") 

runMyBashScriptTask := { 
    val ec = (baseDirectory.value/"myBashScript.sh").getAbsolutePath ! 
    val log = streams.value.log 
    log.debug(s"Exit code: $ec") 
} 

runMyBashScriptTask <<= runMyBashScriptTask triggeredBy (doc in Compile) 

Er geht davon aus, dass myBashScript.sh im Hauptverzeichnis des Projektes ist es, wie durch baseDirectory Einstellung hingewiesen.