2011-10-22 2 views
2

J'ai un projet web multimodule avec un graphe de dépendance similaire à ceSBT: Traverse projet graphique de dépendance

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

qui est le projet de guerre dépend de A1 qui à son tour dépend de A2 et A3 et ainsi de suite.

Maintenant, avant l'empaquetage du projet de guerre, je veux copier quelques ressources Web de ses projets dépendants dans la webapp. Donc, ma question est comment est-ce que je traverse par programmation le graphe de dépendance d'un projet SBT? à-dire dans le code pseudu

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

Remarque Je suis conscient que si j'ajouter le dossier des ressources au classpath de chacune des dépendances alors je pourrais le récupérer de la fullClasspath dans le projet web. Mais je voudrais éviter cette solution et il existe également d'autres scénarios où traverser et s'interconnecter par programmation avec des dépendances pourrait être utile.

Répondre

1

Le code suivant ajoute une tâche agr-res qui agréger toutes les ressources pour les projets dépendants:

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 
} 

J'ai fait un point essentiel avec un exemple plus complet here

Questions connexes