【问题标题】:How to run bash script after generating scaladoc using doc task?使用 doc 任务生成 scaladoc 后如何运行 bash 脚本?
【发布时间】:2014-08-02 03:03:05
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: sbt scaladoc


    【解决方案1】:

    其实很简单。首先,我检查了 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 上可能会有细微差别。

    【讨论】:

      【解决方案2】:

      在 sbt 0.13 和最新版本中,也可以使用 :=.value 宏来实现用例(它们都旨在比 &lt;&lt;= 更简单):

      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 设置所指向的那样。

      【讨论】:

        猜你喜欢
        • 2016-06-03
        • 1970-01-01
        • 2015-12-06
        • 2013-12-14
        • 2019-08-07
        • 1970-01-01
        • 2014-10-17
        • 2020-09-21
        • 2022-01-05
        相关资源
        最近更新 更多