2013-05-27 96 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。