【发布时间】:2014-08-02 03:03:05
【问题描述】:
我有一个简短的 Bash 脚本,它在我的 Scaladoc cmets 上执行查找和替换,以生成指向第三方库的外部文档的链接。我希望每次使用 doc 任务生成 Scaladocs 时都运行此脚本。
我怎样才能做到这一点?
【问题讨论】:
我有一个简短的 Bash 脚本,它在我的 Scaladoc cmets 上执行查找和替换,以生成指向第三方库的外部文档的链接。我希望每次使用 doc 任务生成 Scaladocs 时都运行此脚本。
我怎样才能做到这一点?
【问题讨论】:
其实很简单。首先,我检查了 doc 以查看它是什么(在 sbt 提示符下为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 上可能会有细微差别。
【讨论】:
在 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 设置所指向的那样。
【讨论】: