如何使用doc任务生成scaladoc后运行bash脚本?

时间:2013-03-04 22:35:01

标签: sbt scaladoc

我有一个简短的Bash脚本,可以对我的Scaladoc注释进行查找和替换,以生成指向第三方库的外部文档的链接。我希望每次使用doc任务生成Scaladocs时都会运行此脚本。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

实际上很容易。首先,我检查了doc以查看它是什么(在{snt提示符上inspect doc),注意到它是一项任务,并继续在build.sbt上声明对自身的依赖:

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

我以前用bash执行的操作与scala.sys.process相同,因此您可以查找Scaladoc for that。这是在SBT 0.12.2上测试的,我认为在SBT 0.11.x或0.10.x上可能存在小的差异。

答案 1 :(得分:1)

在sbt 0.13和最新版本中,还可以使用:=.value宏来实现用例(这两个宏都旨在比<<=更简单):

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
}

您可能还需要triggeredBy任务方法,如下所示:

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)

它假定myBashScript.sh位于项目的主目录中,如baseDirectory设置所指示。