在SBT中获取“提供的”依赖项

时间:2013-05-27 07:38:22

标签: scala sbt

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

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

  • A 有一些(JAR)依赖项,并将已编译的类文件导出到path/to/A/target
  • B 取决于provided范围内的 A Project("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 项目中使用provided时, A 模块会显示在show update范围内。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我在阅读this answer后最终使用了这项任务,但却很难找到:

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

答案 1 :(得分:0)

我尝试了F.X.提供的解决方案,但它一直向我显示一个空的依赖列表(包括提供的和其他的)。

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

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"))
},

我使用此列表将所提供的deps排除在我的“all in one”声纳插件中。