首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将InputKey和TaskKey组合成一个新的InputKey?

如何将InputKey和TaskKey组合成一个新的InputKey?
EN

Stack Overflow用户
提问于 2015-01-24 21:43:55
回答 1查看 626关注 0票数 0

我有一个SBT多项目,其中包括两个子项目。一个是普通的Scala web服务器项目,另一个只是一些web文件。使用我自己编写的SBT插件,我可以在web项目上运行Gulp。此Gulp任务异步运行。所以有了

代码语言:javascript
复制
sbt "web/webAppStart" "server/run"

我可以并行启动Gulp开发web服务器和Scala后端服务器。现在我想创建一个新任务,将两者结合起来。所以之后

代码语言:javascript
复制
sbt dev

例如,应该做同样的事情。这是我到目前为止尝试过的:

代码语言:javascript
复制
// 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任务,比如

代码语言:javascript
复制
.settings(dev <<= (runWeb, runServer) map { (_, _) => {
  // do nothing
})

然后我得到了错误

代码语言:javascript
复制
[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

EN

回答 1

Stack Overflow用户

发布于 2015-01-26 01:22:23

tl;dr使用.value宏来执行相关任务,或仅alias任务序列。

使用.value

在我看来,您的情况过于复杂了,因为0.13版本之前的语法(<<=)和project/Build.scala的使用(这通常会让人感到困惑,而不是对新手有帮助)。

您应该只在另一个任务中执行这两个任务,如下所示:

代码语言:javascript
复制
dev := {
  runWeb.value
  runServer.value
}

完整的示例:

代码语言:javascript
复制
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命令...

代码语言:javascript
复制
[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`.

只需定义要在别名中执行的任务/命令,如下所示:

代码语言:javascript
复制
addCommandAlias("devAlias", ";runServer;runWeb")

像使用内置任务一样使用devAlias

代码语言:javascript
复制
[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 PM
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28126133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档