如何创建任务取决于其他任务?

时间:2017-12-18 16:39:02

标签: sbt sbt-assembly

我是sbt的新手,我尝试创建一个脚本,用于部署我的应用程序或部署运行应用程序。

对我来说已经有用的是

sbt deploy

将成功将最终的.jar文件部署到删除位置。

但是,我不知道如何让deployAndRunTask依赖于deployTask。我尝试了几件事,但到目前为止都没有。

我最后的希望是

deployAndRunTask := {
  val d = deployTask.value
}

然而,这似乎不起作用。

这是我目前所处的脚本,但sbt deploy-run只会执行deployAndRunTask任务,而不会执行deyployTask

// DEPLOYMENT

val deployTask = TaskKey[Unit]("deploy", "Copies assembly jar to remote location")

deployTask <<= assembly map { (asm) =>
  val account = "user@example.com" 
  val local = asm.getPath
  val remote = account + ":" + "/home/user/" + asm.getName
  println(s"Copying: $local -> $account:$remote")
  Seq("scp", local, remote) !!
}

val deployAndRunTask = TaskKey[Unit]("deploy-run", "Deploy and run application.")

deployAndRunTask := {
  val d = deployTask.value
}

deployAndRunTask <<= assembly map { (asm) =>
  println(s"Running the script ..")
}

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

问题在于您定义了任务,然后重新定义它。因此,只考虑后一种定义。您无法将任务定义与其对另一个任务的依赖关系分开。你还在sbt中使用了几个过时的东西:

  • 使用taskKey宏,您无需考虑任务名称,因为它与密钥名称相同:

    val deploy = taskKey[Unit]("Copies assembly jar to remote location")
    val deployAndRun = taskKey[Unit]("Deploy and run application.")
    

    然后,您可以在deploy和sbt shell

  • 中将它们称为deployAndRunbuild.sbt
  • <<=替换为:=,将keyname map { (keyvalue) => ... }替换为keyname.value。事情更简洁,更容易编写。

您可以阅读有关Migrating from sbt 0.13.x的更多信息。

所以这是您的deployAndRun任务定义,包含以下更改:

deployAndRun := {
  val d = deploy.value
  val asm = assembly.value
  println(s"Running the script ..")
}

它依赖于deployassembly任务,并且在执行任何其他操作之前都会运行它们。您也可以使用dependsOn,但我认为这里没有必要。

您可能也有兴趣调查Defining a sequential task with Def.sequentialDefining a dynamic task with Def.taskDyn