如何创建任务取决于另一项任务?

问题描述 投票:0回答:1

我是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 = "[email protected]" 
  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 ..")
}

这里有什么问题?

sbt sbt-assembly
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.