Объединение задачи ввода с динамической задачей в sbt

Я хотел бы сделать задачу ввода, которая приведет пользователя к вводу и сгенерирует последовательность подзадач для запуска. Вот пример:

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
 }
}
</arg>

Есть два образца. Первый работает и показывает простой taskDyn с предопределенным вводом. Вторая задача - это динамическая задача с пользовательским вводом, которая отказывается компилировать с ошибкой, которую я не могу интерпретировать

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

Как я могу избежать этого?

Журнал проб и ошибок

Там я бы добавил свой вопрос с различными предлагаемыми изменениями, которые все еще не могут решить проблему.

заменить InputTask.value на InputTask.evaluated

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

Если бы я смог определить правильную InputTask, к ней должен быть обращен метод evaluated, как я нашел как в документации, так и на практике после попытки воспроизведения с различными входящими командами, которые компилируются.

Тем не менее, это не решит проблему, которую отказывает макрос mbt при условии inputTaskDyn.

ждет других предложений

1 ответ

Метод проб и ошибок дал мне ответ, но не понял. Вот он:

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)
 }
}
</arg>

По какой-то причине я не могу понять, что вы должны изолировать создание многозадачности из последовательности отдельных задач в отдельном методе.

licensed under cc by-sa 3.0 with attribution.