5

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

我怎样才能做到这一点?

4

2 回答 2

5

这实际上很容易。首先,我检查了 doc 以查看它是什么(inspect doc在 sbt 提示符上),注意到它是一项任务,然后继续声明对自身的依赖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。这是在 SBT 0.12.2 上测试的,我认为在 SBT 0.11.x 或 0.10.x 上可能会有细微差别。

于 2013-03-05T02:33:42.447 回答
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

于 2014-08-01T19:01:18.700 回答