我有一個簡短的Bash腳本,在我的Scaladoc註釋中查找並替換,以便生成指向第三方庫的外部文檔的鏈接。我希望每次使用doc
任務生成Scaladoc時都運行此腳本。如何使用doc任務生成scaladoc後運行bash腳本?
我怎樣才能做到這一點?
我有一個簡短的Bash腳本,在我的Scaladoc註釋中查找並替換,以便生成指向第三方庫的外部文檔的鏈接。我希望每次使用doc
任務生成Scaladoc時都運行此腳本。如何使用doc任務生成scaladoc後運行bash腳本?
我怎樣才能做到這一點?
這其實很簡單。首先,我檢查文檔,看看它是什麼(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 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
設置爲指向。