Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

combining input task with dynamic task in sbt

Tags:

scala

sbt

I'd like to make an input task that proceed user input and generate bunch of subtasks to run. Here is the example:

import sbt._
import Keys._
import Def.Initialize
import complete.DefaultParsers._

object TestBuild extends Build {
  val sampleInput = inputKey[Seq[String]]("sample dynamic input task")
  val sampleDynamic = taskKey[Seq[String]]("sample dynamic task")

  override lazy val settings = super.settings ++ Seq(
    sampleDynamic := Def.taskDyn {
      val sources = Seq("ab", "csd", "efda")
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value,
    sampleInput := Def.inputTaskDyn {
      val sources = spaceDelimited("<arg>").parsed
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value
  )

  private def sampleTaskFor(source : String) : Initialize[Task[String]] = Def.task {
    source + " : " + source
  }
}

There are two samples. The first works and shows simple taskDyn with predefined input. The second is intended dynamic task with user input that refuses to compile with error that I can not interpret

[error] home/project/build.scala:15: Illegal dynamic reference: Def
[error]     sampleInput := Def.inputTaskDyn {
[error]                                     ^
[error] one error found
[error] (compile:compile) Compilation failed

How can I avoid it?


Trial and error log

There I would append my question with different proposed changes that still can not solve the issue

replace InputTask.value with InputTask.evaluated

      sources.map(sampleTaskFor _).joinWith(_.join)
-   }.value
+   }.evaluated
  )

If I would able to define correct InputTask it should be accessed via evaluated method, as I've found both in documentation and in practice after trying to play with different InputTasks that compiles.

Still that would not fix the issue that sbt macro engine refuses provided inputTaskDyn.


waiting for other suggestions

like image 820
ayvango Avatar asked May 29 '14 09:05

ayvango


1 Answers

Trial and error method gave me the answer but non a single bit of understanding. Here it is:

import sbt._
import Keys._
import Def.Initialize
import complete.DefaultParsers._

object TestBuild extends Build {
  val sampleInput = inputKey[Seq[String]]("sample dynamic input task")
  val sampleDynamic = taskKey[Seq[String]]("sample dynamic task")

  override lazy val settings = super.settings ++ Seq(
    sampleDynamic := Def.taskDyn {
      val sources = Seq("ab", "csd", "efda")
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value,
    sampleInput := Def.inputTaskDyn {
      val sources = spaceDelimited("<arg>").parsed
      sampleTaskAll(sources)
    }.evaluated
  )

  private def sampleTaskFor(source : String) : Initialize[Task[String]] = Def.task {
    source + " : " + source
  }

  private def sampleTaskAll(sources : Seq[String]) : Initialize[Task[Seq[String]]] = Def.taskDyn {
    sources.map(sampleTaskFor _).joinWith(_.join)
  }
}

For a reason I can not comprehend you should isolate creating multitask out of sequence of single tasks in a separate method.

like image 140
ayvango Avatar answered Oct 19 '22 01:10

ayvango