我是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中使用了几个过时的东西:
taskKey
宏,你不需要考虑任务名称,因为它与键名相同:
val deploy = taskKey[Unit]("Copies assembly jar to remote location")
val deployAndRun = taskKey[Unit]("Deploy and run application.")
然后你可以在deploy
和sbt shell中将它们称为deployAndRun
和build.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 ..")
}
它依赖于deploy
和assembly
任务,并且在执行任何其他操作之前都会运行它们。你也可以使用dependsOn
,但我认为这里没必要。
您可能也有兴趣研究Defining a sequential task with Def.sequential
和Defining a dynamic task with Def.taskDyn
。