Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run bash script after generating scaladoc using doc task?

Tags:

sbt

scaladoc

I have a short Bash script that does a find-and-replace on my Scaladoc comments in order to generate links to external documentation of a third-party library. I would like this script to run every time I generate Scaladocs using the doc task.

How can I achieve this?

like image 367
Ryan Avatar asked Mar 04 '13 22:03

Ryan


2 Answers

In sbt 0.13 and the latest releases the use case can also be achieved with := and .value macros (that are both aimed at being simpler than <<=):

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
}

You may also like triggeredBy method for tasks as follows:

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)

It assumes that myBashScript.sh is in the main directory of the project as pointed by baseDirectory setting.

like image 38
Jacek Laskowski Avatar answered Oct 12 '22 18:10

Jacek Laskowski


It's actually pretty easy. First, I inspected doc to see what it was (inspect doc on the sbt prompt), noticed it was a task, and proceeded with declaring a dependency on itself on build.sbt:

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

That thing I used to execute bash is the same library as scala.sys.process, so you can look up Scaladoc for that. This was tested on SBT 0.12.2, and I think there might be a small difference on SBT 0.11.x or 0.10.x.

like image 154
Daniel C. Sobral Avatar answered Oct 12 '22 16:10

Daniel C. Sobral