2016-05-25 9 views
1

私はsbt-assemblyで生成されたjarファイルのbase64でエンコードされたSHA-256ハッシュを計算する必要があるScalaプロジェクトに取り組んでいます。私はこれを実現するための簡単なScalaの方法を書かれている:File引数を取り、Fileを返すカスタムSBTタスクを定義する方法は?

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メソッドを呼び出します:私はこのような何かをできるようにしたいと思います。余分なボーナスオートメーションの点については、プラグインで作成されたタスクもcomputeCodeHashメソッドを実行するようにビルドを拡張する方法を理解したいと思います。

私は入力タスクや設定、パーサーのドキュメントを読んでみましたが、SBTの知識は限られており、かなり基本的な作業の仕方を理解することができません。私もsbt-assemblyソースコードを読んでみましたが、頭や尾を作ることができませんでした。

何か指摘していただければ幸いです。このような

答えて

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 
+0

おかげで、私はそう慣用的ではないが類似のものを持っていた私は、タスクがと統合を取得する方法を見つけ出すことができませんでした@ed 'アセンブリ' DefaultParserではfileParserを見つけました。これは、タブ補完で引数がベースディレクトリに対するファイルパスであることを知ることができるので便利です。 – anelson

関連する問題