2013-05-27 97 views
2

我试图在SBT中使用provided配置,但我无法弄清楚如何获取完整的provided依赖关系类路径。获取SBT中“提供”的依赖项

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

  • 一个有几个(JAR)的依赖,并出口编译的类文件path/to/A/target
  • B取决于Aprovided范围内( Project("B") dependsOn(A % "provided"))并且导出编译后的类文件t øpath/to/B/target

,它返回所提供的广口瓶,但不是所提供的内部依赖关系:

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

这将返回每个配置的内部依赖关系(path/to/A/target),但没有具体的provided范围,和不输出JAR依赖性:

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

然而,A模块在B项目中使用show update时出现在provided范围内。

任何想法?

回答

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 
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。