我是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 ..")
}
这里有什么问题?
答案 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
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
。