How to exclude transitive dependencies of other subproject in multiproject builds? How to exclude transitive dependencies of other subproject in multiproject builds? android android

How to exclude transitive dependencies of other subproject in multiproject builds?


This appears to work for me:

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

What the projectDepenendencies is doing is what sbt, by default, attempts to do. It converts any inter-project dependencies into ModuleIDs which Ivy will use during resolution. Because the Project API has no way to specify excludes currently, we bypass this automatic layer and manually declare the Ivy dependency as well.

Result:

> 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) ...

And the dependent project with junit/hamcrest excluded:

> 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: ...