如何从我的SBT任务调用另一个任务?

时间:2013-11-21 01:23:31

标签: scala task sbt

我正在尝试在我的任务中调用runTask并认为这样可行:

name := "hello"

version := "1.0"

scalaVersion := "2.10.2"

lazy val hello = taskKey[Unit]("executes hey")

lazy val helloTask = hello <<= runTask(fullClasspath, "sample.Hey" in run, runner in run)

但是,它没有。关于我如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:23)

一般回答:

要回答您的一般问题,解决方案是让您的任务取决于其他任务。直接调用任务将绕依赖系统,并行执行系统等运行。你依赖并调用这样的任务(用0.13风格的语法):

myTask := {
  ...
  val result = otherTask.value
  ...
}

请注意otherTask将在myTask开始之前调用,而不是在依赖关系出现的myTask正文中调用;因为这就是依赖关系的工作原理。

如果无论出于何种原因你发现“正常”方式不合适或不可接受,请考虑sbt中的好风格是将任务的声明与其实现分开。典型的任务实现只是编组参数,然后调用实际完成工作的方法。如果您要调用的任务是以这种方式实现的,那么回答“如何调用任务T?”是“不要;调用相同的代码T调用。”

具体答案:

但是从你的例子来看,我认为你实际上要解决的问题是“我怎样才能创建自定义运行任务,除了运行?”这个问题在sbt FAQ中得到了解答;见http://www.scala-sbt.org/0.13.0/docs/faq.html。答案是使用便捷方法fullRunTaskfullRunInputTask

顺便说一下,如果你查看这些方法的源代码,你会发现它们没有创建调用另一个任务的任务;相反,他们采用“调用相同代码”的方法。