2

我正在尝试使用providedSBT 中的配置,但我无法弄清楚如何获取完整的provided依赖类路径。

为简单起见,假设我有两个项目AB

  • A有一些(JAR)依赖项,并将编译的类文件导出到path/to/A/target
  • B在作用域 ( ) 中依赖A并将编译后的类文件导出到providedProject("B") dependsOn(A % "provided")path/to/B/target

B中,这将返回提供的 JAR,但不返回提供的内部依赖项:

providedDependencies <<= (update) map (_.select(Set("provided")))

这将返回每个配置的内部依赖项 ( path/to/A/target),但不是专门针对provided范围,并且不输出 JAR 依赖项:

providedDependencies <<= (internalDependencyClasspath) map (_.files)

但是,在B项目中使用时, A模块会显示在provided范围内。show update

任何想法?

4

2 回答 2

0

我尝试了FX提供的解决方案,但它一直向我显示一个空的依赖项列表(无论是提供的还是其他的)。

我发现您可以要求“更新”任务为您提供完整视图,然后您可以根据配置进行过滤(例如“提供”)。

val providedDependencies = TaskKey[Seq[java.io.File]]("task-provided-deps","The list of dependencies in the 'provided' scope")
...
providedDependencies <<= (update) map {
    up.select(configurationFilter("provided"))
},

我使用此列表将提供的部门排除在我的“一体式”声纳插件之外。

于 2013-08-05T00:33:26.757 回答
0

阅读此答案后,我最终使用了此任务,但很难找到:

def providedInternalDependenciesTask(proj: ProjectRef, struct: Load.BuildStructure) = {
    // "Provided" dependencies of a single ResolvedProject
    def providedDeps(op: ResolvedProject): Seq[ProjectRef] = {
      op.dependencies
        .filter(p => (p.configuration getOrElse "") == "provided")
        .map(_.project)
    }

    // Collect every "provided" dependency in the dependency graph
    def collectDeps(projRef: ProjectRef): Seq[ProjectRef] = {
      val deps = Project.getProject(projRef, struct).toSeq.flatMap(providedDeps)
      deps.flatMap(ref => ref +: collectDeps(ref)).distinct
    }

    // Return the list of "provided" internal dependencies for the ProjectRef
    // in argument.
    collectDeps(proj)
      .flatMap(exportedProducts in (_, Compile) get struct.data)
      .join.map(_.flatten.files)
  }

用法示例:

val providedInternalDependencies = TaskKey[Seq[java.io.File]]
...
providedInternalDependencies <<= (thisProjectRef, buildStructure) flatMap providedInternalDependenciesTask
于 2013-05-27T21:58:18.483 回答