使用自定义任务调用子项目的main

mat*_*ter 5 sbt

我有一个项目为一堆项目执行集成测试,这些项目都捆绑在同一个多项目构建中.集成测试通过常规main(object Runner extends App)运行.

我希望能够通过命名的任务或命令从多项目构建的根项目运行它integrationTest,所以我尝试:

val integrationTest = taskKey[Unit]("Executes integration tests.")

lazy val root = (project in file(".")).aggregate(projIntegrationTest, projA, projB, ...).settings(
  integrationTest := (run in Compile in projIntegrationTest).value
)
Run Code Online (Sandbox Code Playgroud)

当我integrationTest在提示上发出时,什么都不做,只发出:

[成功]总时间:0秒,2015年10月23日12:31:21 AM完成

我怎样才能找出为什么在我的自定义任务运行时它无法integrationTest运行?

奇怪的是,替换runcompilepublishlocalintegrationTest := (run in Compile in projIntegrationTest).value上面,我的自定义任务行按预期运行,并在执行自定义任务时负责编译或发布.

Set*_*sue 6

它不起作用,因为它run是一个InputTask,而不是一个常规的Task.

你需要这样做:

integrationTest :=
  (run in Compile in projIntegrationTest)
    .toTask("").value
Run Code Online (Sandbox Code Playgroud)

这将在http://www.scala-sbt.org/0.13/docs/Input-Tasks.html的 "从输入任务中获取任务"部分中介绍.

截至sbt 0.13.13,您的代码给出:

warning: `value` is deprecated for an input task. Use `evaluated` or `inputTaskValue`.
Run Code Online (Sandbox Code Playgroud)

这是一个很好的改进; 早期版本的sbt让这个通过,使得很难排除故障.(但请注意,弃用消息提示的解决方案与我在此处使用的解决方案不同;我没有调查过这种差异.有人可以对此有所了解吗?)