Я пытаюсь генерировать источники в своем проекте только при необходимости.В моем случае «необходимый» - это когда какой-либо зависимый проект изменился.
У меня есть рабочий код, который всегда запускает код генерации:
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
, чтобы развернуть действительное значение до требуемого типа, но я не могу понять, где их разместить.
Как бы я сделал эту работу?