У меня есть следующий пример build.sbt, который использует sbt-assembly
. (Мои assembly.sbt и project/assembly.sbt настроены, как описано в readme.)
import AssemblyKeys._
organization := "com.example"
name := "hello-sbt"
version := "1.0"
scalaVersion := "2.10.3"
val hello = taskKey[Unit]("Prints hello")
hello := println(s"hello, ${assembly.value.getName}")
val hey = taskKey[Unit]("Prints hey")
hey <<= assembly map { (asm) => println(s"hey, ${asm.getName}") }
//val hi = taskKey[Unit]("Prints hi")
//hi <<= assembly { (asm) => println(s"hi, $asm") }
Оба hello
и hey
являются функционально эквивалентными, и когда я запускаю любую задачу из sbt, они сначала запускают assembly
и печатают сообщение с тем же именем файла. Есть ли значимая разница между двумя? (Похоже, что определение hello
является "слегка магическим", поскольку зависимость от сборки подразумевается там, а не явно.)
Наконец, я пытаюсь понять, почему hey
нужен вызов map
. Очевидно, это приводит к тому, что другой объект передается в asm
, но я не совсем уверен, как исправить ошибку этого типа в определении hi
:
sbt-hello/build.sbt:21: error: type mismatch;
found : Unit
required: sbt.Task[Unit]
hi <<= assembly { (asm) => println(s"hi, $asm") }
^
[error] Type error in expression
Похоже, что assembly
здесь [sbt.TaskKey[java.io.File]][2]
, но я не вижу там определенного метода map
, поэтому я не могу понять, что происходит в типе hey
выше.