我正在处理一个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
源代码,但我无法做出正面或反面。
任何指针都会受到赞赏。
答案 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