SBT: пересечь график зависимости проекта - PullRequest
2 голосов
/ 23 октября 2011

У меня есть многомодульный веб-проект с графиком зависимостей, похожим на этот

WAR-project
- A1
-- A2
-- A3
- B1
-- B2
---- B22
-- B3

, то есть военный проект зависит от A1 , что, в свою очередь, зависит от A2 и A3 и т. Д.

Теперь перед упаковкой военного проекта я хочу скопировать некоторые веб-ресурсы из зависимых проектов в веб-приложение. Таким образом, мой вопрос заключается в том, как мне программно пересечь граф зависимостей проекта SBT? то есть в псевдокоде

resourcesToCopy = []
visitedProjects = []
traverseProjectDependencies(project) {
  visitedProjects += project
  if(project has resourceFolder) {
    resourcesToCopy += resourceFolder.getPath
  }
  for(projectDependency in project) {
    if(projectDependency is not visited) {
      traverseProjectDependencies(projectDependency)
    }
  }
}

Примечание Мне известно, что если я добавлю папку ресурсов в путь к классу каждой из зависимостей, то я смог бы извлечь ее из fullClasspath в веб-проекте. Но я хотел бы избежать этого решения, а также есть другие сценарии, где программный обход и взаимодействие с зависимостями могут быть полезны.

1 Ответ

1 голос
/ 07 ноября 2011

В следующем коде добавлена ​​задача aggr-res , которая объединит все ресурсы для зависимых проектов:

val aggrRes= TaskKey[Seq[File]]("aggr-res", "show aggregate resources")

val aggrResTask = aggrRes in Compile <<= {
  (thisProjectRef, buildStructure) flatMap aggrResources(resources in Compile)
}

def aggrResources[T](key: ScopedTask[Seq[T]])(proj: ProjectRef, struct: Load.BuildStructure) = {
  val deps = collectDeps(_.dependencies.map(_.project))(proj, struct)
  deps.flatMap(key in (_, Compile) get struct.data).join.map(_.flatten)
}

def collectDeps(op: ResolvedProject => Seq[ProjectRef])(projRef: ProjectRef, struct: Load.BuildStructure): Seq[ProjectRef] = {
  val deps = Project.getProject(projRef, struct).toSeq.flatMap(op)
  deps.flatMap(ref => ref +: collectDeps(op)(ref, struct)).distinct
}

Здесь я изложил более полный пример

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