How to reference external sbt project from another sbt project?
I have the following setup of a Scala application and a common core library: root
-> /ApplicationA
-> /project
-> /build.sbt
-> /CoreLibrary
-> /project
-> /build.sbt
I want to add a reference from ApplicationA to CoreLibrary à la Eclipse project reference, so that every time CoreLibrary changes ApplicationA is built as well. I´ve tried the following contents of build.Scala for ApplicationA:
val core = Project(
id = "platform-core",
base = file("../CoreLibrary"))
val main = Project(id = "application, base = file(".")).dependsOn(core)
However, when compiling ApplicationA SBT complains that a dependency can only be a subdirectory!!:
java.lang.AssertionError: assertion failed: Directory C:\git\CoreLibrary is not contained in build root C:\git\ApplicationA
This seems completely straightforward, what's the correct way of having this project dependency?
Solution 1:
You can do a source dependency on your project like that :
lazy val core = RootProject(file("../CoreLibrary"))
val main = Project(id = "application", base = file(".")).dependsOn(core)
I have a working example with a multimodule play build : https://github.com/ahoy-jon/play2MultiModule/blob/master/playapp/project/Build.scala
But I think the proper way (it depends of your context) of doing it is to create a
-> /project/
-> Build.scala
-> /ApplicationA
-> /project
-> /build.sbt
-> /CoreLibrary
-> /project
-> /build.sbt
referencing the two projects and the dependencies between them.
Solution 2:
With sbt 0.12.1 it seems possible to get a simple reference to a project :
I used ProjectRef
instead of RootProject
http://www.scala-sbt.org/0.12.1/api/sbt/ProjectRef.html
ProjectRef(file("../util-library"), "util-library")
sbt-eclipse also works.
Solution 3:
Since sbt 0.13, you may create multi-project definitions directly in .sbt
without needing a Build.scala
file.
So adding the following to ApplicationA/project/build.sbt would be sufficient.
lazy val core = RootProject(file("../CoreLibrary"))
val main = Project(id = "application", base = file(".")).dependsOn(core)