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)