Как получить список подпроектов динамически в SBT 0,13 - PullRequest
0 голосов
/ 28 декабря 2018

Как программно (в build.sbt) найти все подпроекты текущего корневого проекта в sbt 0.13?(Я еще не пробовал Project.componentProjects, потому что он новый в sbt 1.0).

lazy val root = (project in file(".") ... )

val myTask = taskKey[Unit]("some description")

myTask := {
  val masterRoot = baseDirectory.value
  // This does not work
  // val subProjects: Seq[ProjectReference] = root.aggregate
  // So I tried to specify the subproject list explicitly; still does not work
  val subProjects = Seq[Project](subPrj1)
  subProjects.foreach { subproject =>
    // All of this works if the "subproject" is hard-coded to "subPrj1"
    val subprojectTarget = target.in(subproject).value / "classes"
    val cp = (dependencyClasspath in(subproject, Compile, compile)).value
  }
}

Получил эти ошибки:

build.sbt: error: Illegal dynamic reference: subproject
    val subprojectTarget = target.in(subproject).value / "classes"
                                     ^
build.sbt: error: Illegal dynamic reference: subproject
    val cp = (dependencyClasspath in(subproject, Compile, compile)).value

1 Ответ

0 голосов
/ 02 января 2019

Вы можете получить доступ ко списку всех подпроектов через buildStructure.value.allProjectRefs.

Другая часть вашей проблемы - ужасная проблема, с которой я также сталкивался довольно часто.Я смог обойти такие проблемы, сначала создав List[Task[A], а затем с помощью рекурсивной функции перевести его в Task[List[A]].

def flattenTasks[A](tasks: Seq[Def.Initialize[Task[A]]]): Def.Initialize[Task[List[A]]] =
  tasks.toList match {
    case Nil => Def.task { Nil }
    case x :: xs => Def.taskDyn {
      flattenTasks(xs) map (x.value :: _)
    }
  }

myTask := {
  val classDirectories: List[File] = Def.taskDyn {
    flattenTasks {
      for (project ← buildStructure.value.allProjectRefs)
        yield Def.task { (target in project).value / "classes" }
    }
  }.value
}

Я использовал этот подход, например, здесь: служебные методы фактическое использование

...