我正在尝试使用SBT中的provided
配置,但我无法弄清楚如何获取完整的provided
依赖类路径。
为简单起见,假设我有两个项目, A 和 B :
path/to/A/target
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
范围内。
有什么想法吗?
答案 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”声纳插件中。