如何定义一个带有File参数并返回File的自定义SBT任务?

时间:2016-05-25 17:31:36

标签: scala sbt

我正在处理一个Scala项目,该项目要求我计算用sbt-assembly生成的jar文件的base64编码的SHA-256哈希值。我写了一个简单的Scala方法来实现这个目的:

    def computeCodeHash(file: File): File = {
     //..do some work and write the hash to a new file with a '.sha256' extension
    }

现在我需要创建一个SBT命令,我可以调用它来计算这个哈希值。我希望能够做到这样的事情:

    > codehash "target/scala-2.11/foo.jar"

并让该任务调用我的computeCodeHash方法。对于额外奖励自动化点,我还想弄清楚如何扩展构建,以便assembly插件创建的sbt-assembly任务也运行我的computeCodeHash方法。 / p>

我已经尝试阅读有关输入任务和设置以及解析器的文档,但我对SBT的了解有限,而且我无法弄清楚如何完成看似非常基本的任务。我也试过阅读sbt-assembly源代码,但我无法做出正面或反面。

任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

这样的东西?:

import sbt.Keys._
import sbt._
import sbtassembly.AssemblyKeys._

object Build extends sbt.Build {


  private def mkHash(pathToFile:String) : String = {
    println(s"make a hash here for: $pathToFile")
    "??"
  }

  lazy val codehash = inputKey[Option[String]]("Mk hash")


  val codehashTask = codehash := {
    val s = streams.value
    val args = sbt.complete.Parsers.spaceDelimited("<arg>").parsed
    args.headOption.map{ path =>
      s.log.info(s"make a hash for: $path")
      mkHash(path)
    }
  }

  lazy val root = Project("sbt-hash-task", file("."))
      .settings(
        codehashTask,
        (assembly) := {
          val out = assembly.value
          mkHash(out.getAbsolutePath)
          out
        }
      )

}

用法:

sbt
> codehash some/path.jar
> assembly //runs assembly and codehash