我有一个SBT多项目,其中包括两个子项目。一个是普通的Scala web服务器项目,另一个只是一些web文件。使用我自己编写的SBT插件,我可以在web项目上运行Gulp。此Gulp任务异步运行。所以有了
sbt "web/webAppStart" "server/run"我可以并行启动Gulp开发web服务器和Scala后端服务器。现在我想创建一个新任务,将两者结合起来。所以之后
sbt dev例如,应该做同样的事情。这是我到目前为止尝试过的:
// Build.sbt (only the relevant stuff)
object Build extends sbt.Build {
lazy val runServer: InputKey[Unit] = run in server in Compile
lazy val runWeb: TaskKey[Unit] = de.choffmeister.sbt.WebAppPlugin.webAppStart
lazy val dev = InputKey[Unit]("dev", "Starts a development web server")
// Scala backend project
lazy val server = (project in file("project-server"))
// Web frontend project
lazy val web = (project in file("project-web"))
// Root project
lazy val root = (project in file("."))
.settings(dev <<= (runServer) map { (_) => {
// do nothing
})
.aggregate(server, web)到目前为止,这是可行的。现在我没有任何想法,如何让dev也依赖于runWeb任务。如果我只添加runWeb任务,比如
.settings(dev <<= (runWeb, runServer) map { (_, _) => {
// do nothing
})然后我得到了错误
[error] /Users/choffmeister/Development/shop/project/Build.scala:59:value map is not a member of (sbt.TaskKey[Unit], sbt.InputKey[Unit])
[error] .settings(dev <<= (runWeb, runServer) map { (_, _) =>
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed有没有人能帮我一下?
最佳解决方案是将提供给dev的参数传递给runServer任务。但我也可以让dev变成一个TaskKey[Unit],然后硬编码运行不带参数的runServer。
发布于 2015-01-26 01:22:23
tl;dr使用.value宏来执行相关任务,或仅alias任务序列。
使用.value宏
在我看来,您的情况过于复杂了,因为0.13版本之前的语法(<<=)和project/Build.scala的使用(这通常会让人感到困惑,而不是对新手有帮助)。
您应该只在另一个任务中执行这两个任务,如下所示:
dev := {
runWeb.value
runServer.value
}完整的示例:
lazy val server = project
lazy val runServer = taskKey[Unit]("runServer")
runServer := {
println("runServer")
(run in server in Compile).value
}
lazy val runWeb = taskKey[Unit]("runWeb")
runWeb := {
println("runWeb")
}
lazy val dev = taskKey[Unit]("dev")
dev := {
println("dev")
}
dev <<= dev dependsOn (runServer, runWeb)sbt提供了alias命令...
[sbt-learning-space]> help alias
alias
Prints a list of defined aliases.
alias name
Prints the alias defined for `name`.
alias name=value
Sets the alias `name` to `value`, replacing any existing alias with that name.
Whenever `name` is entered, the corresponding `value` is run.
If any argument is provided to `name`, it is appended as argument to `value`.
alias name=
Removes the alias for `name`.只需定义要在别名中执行的任务/命令,如下所示:
addCommandAlias("devAlias", ";runServer;runWeb")像使用内置任务一样使用devAlias:
[sbt-learning-space]> devAlias
runServer
[success] Total time: 0 s, completed Jan 25, 2015 6:30:15 PM
runWeb
[success] Total time: 0 s, completed Jan 25, 2015 6:30:15 PMhttps://stackoverflow.com/questions/28126133
复制相似问题