我有一个多模块 Web 项目,其依赖关系图与此类似
WAR-project
- A1
-- A2
-- A3
- B1
-- B2
---- B22
-- B3
这就是战争项目所依赖的A1这又取决于A2 and A3等等。
现在,在打包 war 项目之前,我想将一些 Web 资源从其依赖项目复制到 web 应用程序中。所以我的问题是如何以编程方式遍历 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)
}
}
}
Note我知道,如果我将资源文件夹添加到每个依赖项的类路径中,那么我可以从完整类路径在网络项目中。但我想避免这种解决方案,而且在其他情况下,以编程方式遍历和连接依赖项可能会很有用。
下面的代码添加了一个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
}
我用一个更完整的例子做了一个要点here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)