21

Build.scala我有项目之间的依赖关系:

val coreLib = Projects.coreLib()
val consoleApp = Projects.consoleApp().dependsOn(coreLib)
val androidApp = Projects.androidProject().dependsOn(coreLib/*, exclusions = xpp */)

核心库项目在其libraryDependencies(XPP 解析器)中定义了一个库,我想将其排除在 中androidApp,因为 Android 框架有自己的开箱即用的 XPP 实现。

如何从项目的传递依赖项coreLib中排除 XPP 库androidApp

编辑:

根据我的研究,排除可能仅ModuleIDlibraryDependency. 同时dependsOn把所有的传递依赖都放到classpath中,在api中没有办法排除这个项目的一些传递依赖,你dependsOn

细节:

我目前正在运行 sbt 0.13.5。

libraryDependenciescommonLib 以及它在 build.sbt 中提供的各种设置,以便这个项目可以作为独立的重用,并且因为它感觉正确和自然的方式在 .sbt 中提供设置sbt

4

1 回答 1

34

这似乎对我有用:

val someApp = project.settings(
  libraryDependencies += "junit" % "junit" % "4.11"
)

val androidApp = project.dependsOn(someApp).settings(
  projectDependencies := {
    Seq(
      (projectID in someApp).value.exclude("junit", "junit")
    )
  }
)

projectDepenendencies 正在做的是 sbt 默认尝试做的事情。它将任何项目间依赖关系转换为ModuleIDIvy 将在解析期间使用的 s。由于ProjectAPI 目前无法指定排除项,因此我们绕过这个自动层并手动声明 Ivy 依赖项。

结果:

> show someApp/update
...
[info] Update report:
...
[info]  compile:
[info]      org.scala-lang:scala-library:2.10.4 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/home/jsuereth/.sbt/boot/scala-2.10.4/lib/scala-library.jar)
[info]      junit:junit:4.11: (Artifact(junit,jar,jar,None,ArraySeq(master),None,Map()),/home/jsuereth/.ivy2/cache/junit/junit/jars/junit-4.11.jar)
[info]      org.hamcrest:hamcrest-core:1.3: (Artifact(hamcrest-core,jar,jar,None,ArraySeq(master),None,Map()),/home/jsuereth/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.3.jar)
 ...

并且排除了 junit/hamcrest 的依赖项目:

> show androidApp/update
...
[info] Update report:
...
[info]  compile:
[info]      org.scala-lang:scala-library:2.10.4 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/home/jsuereth/.sbt/boot/scala-2.10.4/lib/scala-library.jar)
[info]      someapp:someapp_2.10:0.1-SNAPSHOT: 
...
于 2014-08-05T12:39:08.903 回答