【问题标题】:How to define a custom SBT task that takes a File argument and returns a File?如何定义一个接受 File 参数并返回 File 的自定义 SBT 任务?
【发布时间】:2016-05-27 23:29:51
【问题描述】:

我正在处理一个 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 方法。对于额外的自动化点数,我还想弄清楚如何扩展构建,以便sbt-assembly 插件创建的assembly 任务也运行我的computeCodeHash 方法。

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

任何指针将不胜感激。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    像这样?:

    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
    

    【讨论】:

    • 谢谢@ed,我有类似的东西,但不是那么惯用的,我不知道如何将任务与assembly 集成。请注意,我确实在 DefaultParsers 中找到了一个 fileParser,这很有用,因为它允许 tab 补全知道参数是相对于基目录的文件路径。
    猜你喜欢
    • 2011-08-14
    • 2019-06-30
    • 1970-01-01
    • 2011-10-21
    • 2013-10-01
    • 2017-06-30
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多