Запускать задачу sbt при изменении локальных зависимостей - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь генерировать источники в своем проекте только при необходимости.В моем случае «необходимый» - это когда какой-либо зависимый проект изменился.

У меня есть рабочий код, который всегда запускает код генерации:

def runCodeGeneration(project: Project) = sourceGenerators in Compile += Def.taskDyn {
  val dir = (sourceManaged in Compile).value
  Def.task {
    (project / run in Compile).
      toTask(" " + dir.getAbsolutePath).
      value
    collectFiles(dir)
  }
}.taskValue

lazy val doObject = (project in file("components/objects")).
    dependsOn(doSpec).
    settings(
        runCodeGeneration(doSpec)
    )

lazy val doSpec = (project in file("components/spec"))

С этот вопрос Похоже, что я могу получить фактические файлы в зависимости с (managedClasspath in Compile) map { cp => cp.files }

Адаптируя этот ответ , я пытаюсь что-то вроде

def runCodeGeneration(project: Project) =  {
  val dir = (sourceManaged in Compile).value
    (project / run in Compile).
      toTask(" " + dir.getAbsolutePath).
      value
    collectFiles(dir)
}

def checkCodeGeneration(project: Project) = sourceGenerators in Compile += Def task {

        val cachedFun = FileFunction.cached(
                streams.value.cacheDirectory / "doGeneration"
            ) { (in: Set[File]) =>
                runCodeGeneration(project).toSet
            }
        cachedFun((managedClasspath in Compile) map { cp => cp.files }).toSeq
    }.taskValue

lazy val doObject = (project in file("components/objects")).
    dependsOn(doSpec).
    settings(
        checkCodeGeneration(doSpec)
    )

Не удается:

/Users/me/build.sbt:146: error: type mismatch;
 found   : sbt.Def.Initialize[sbt.Task[Seq[java.io.File]]]
 required: Set[java.io.File]
        cachedFun((managedClasspath in Compile) map { cp => cp.files }).toSeq
                                                ^
[error] sbt.compiler.EvalException: Type error in expression
[error] sbt.compiler.EvalException: Type error in expression
[error] Use 'last' for the full log.

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

Как бы я сделал эту работу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...