SBT:遍历项目依赖图

2023-11-29

我有一个多模块 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(使用前将#替换为@)

SBT:遍历项目依赖图 的相关文章

随机推荐

  • 为什么这个谓词留下一个选择点?

    我写了以下谓词 list withoutlast Last forget the last element list withoutlast First Second List First WithoutLast list withoutl
  • 是否有用于 PDF 元数据的 NPM 模块?

    我正在寻找一个npm模块 我可以用它来编辑元标签 例如Author and TitlePDF 文件 或者 开放许可的 JavaScript 库也可以 有一个程序叫pdftk 如果它是一个 这将是合适的npm module 我还没有测试过这个
  • Dart 中的插入符号有什么作用

    我正在查看一些 Flutter 项目 我注意到以下代码 override int get hashCode gt todos hashCode isLoading hashCode 这个 符号在这里做什么 这行代码是在Flutter项目的A
  • 如何根据 C++ 标准访问对象表示?

    如何访问对象表示 为了回答这个问题 我将其分为两个问题 1 如何获得对象表示的指针 根据标准 我看不到任何方法来获取指向对象表示 人们经常建议这样实现 some type obj const char rep reinterpret cas
  • System.getProperty("java.class.path") 不显示“WEB-INF/lib”和包含的 jar

    String CompilePath abc java JavaCompiler compiler ToolProvider getSystemJavaCompiler String classpath System getProperty
  • 在地图视图中显示动态注释图钉

    我正在开发一个应用程序 它使用MKMapView 我在其中显示了多个注释 现在我想显示引脚的自定义注释图像 我为 MapViewAnnotation 制作了自定义类 import
  • C# 高级排列场景

    我试图弄清楚如何在给定以下信息的情况下找到所有组合 我从一个 JSON 数据集开始 var choices 1 Q 100 R 150 W 250 T 30 2 Q 90 R 130 W 225 T 28 3 Q 80 R 110 W 21
  • 从谷歌驱动器中的特定文件夹获取文件列表

    我正在使用 Google Play 服务 SDK 并尝试了Demos来自开发者网站 有没有办法从特定文件夹获取 下载 所有文件 任何指针都会有很大帮助 整个示例代码似乎并不完整 这是执行类似操作的方法的 await 版本 必须在非 ui 线
  • 如何分组为数组映射?

    Can a groupingBy对流的操作会生成一个映射 其中的值是arrays而不是列表或其他集合类型 例如 我有一堂课Thing 事物有主人 所以Thing has a getOwnerId方法 在事物流中 我想按所有者 ID 对事物进
  • 使用 Flask 框架从 html 播放波形文件?

    这是我的 run py 代码 from flask import app flask Flask name app config from object config app route methods GET POST def new t
  • 以角度形式修补值

    我正在使用 Angular 6 制作一个应用程序 其中我使用的是 Angular 动态形式 截至创建表单并提交 我已完成所有工作 您可以看到工作情况堆栈闪电战 https stackblitz com edit angular x4a5b6
  • WPF OpenFileDialog 与 MVVM 模式? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习 WPF 的 MVVM 模式 我撞墙了 当你需要展示时你会做什么OpenFileDialog 这是我尝试使用它的示例用户界面 单击浏览按钮时 会出现OpenFileDialog应该显示 当用户从文件
  • SKAction playSoundFileNamed 停止背景音乐

    我想要我的SpriteKit游戏不中断用户收听的背景音乐 Music app 或广播应用程序 一切都很顺利 直到执行到这一行 sSharedShootSoundAction SKAction playSoundFileNamed plane
  • 在 mysql php 搜索中突出显示搜索文本

    嗨 这是我的脚本 它可以很好地搜索我的数据库 我有一个表单 html用户在搜索框中输入关键字
  • PHP 表单提交后重定向到新页面

    我有一个表单 在提交表单后将用户重定向到 page1 php 我想要做的是在提交表单后将用户重定向到 page2 php 但我需要确保已发送 POST 请求 例子
  • 如何创建具有标志修改的 QMessageBox 子类?

    我试图使 QMessageBox 中的文本可选择 我发现如果我修改 QMessageBox 上的 setTextInteractionFlags 就可以解决问题 然而 当我尝试这样做时 我的 PyQt 或更具体地说 PySide 抱怨该属性
  • 反应“渲染后”代码?

    我有一个应用程序 我需要动态设置元素的高度 比如说 应用程序内容 它获取应用程序 chrome 的高度并减去它 然后设置 app content 的高度以 100 适合这些约束 对于普通的 JS jQuery 或 Backbone 视图来说
  • 在经典 ASP 中从 ADODB 调用参数化 Oracle 查询

    我目前正在开发一个与 Oracle 数据库交互的经典 ASP 项目 我正在尝试找到一种安全调用 Oracle PL SQL 脚本并使用 ADO 传递参数的方法 当前的解决方案使用嵌入变量手动构建 SQL 脚本 如下所示 strSQL SEL
  • 布尔类型

    在代码审查期间 我发现 C 代码的许多地方如下所示 if IsValid return true else return false 甚至 更好 return IsValid true false 我一直想知道为什么不直接写这样的代码 re
  • SBT:遍历项目依赖图

    我有一个多模块 Web 项目 其依赖关系图与此类似 WAR project A1 A2 A3 B1 B2 B22 B3 这就是战争项目所依赖的A1这又取决于A2 and A3等等 现在 在打包 war 项目之前 我想将一些 Web 资源从其