2012-07-25 263 views
48

我有以下Scala的应用程序的设置和一个共同的核心库: 根如何从其他sbt项目引用外部sbt项目?

-> /ApplicationA 
    -> /project 
    -> /build.sbt 
-> /CoreLibrary 
    -> /project 
    -> /build.sbt 

我想从ApplicationA添加引用CoreLibrary点菜Eclipse项目的参考,让每一位CoreLibrary改变ApplicationA时间也建造。从来就试图build.Scala为ApplicationA以下内容:

val core = Project(
     id = "platform-core", 
     base = file("../CoreLibrary")) 

    val main = Project(id = "application, base = file(".")).dependsOn(core) 

然而,编译时ApplicationA SBT抱怨的依赖只能是一个子目录!!:

java.lang.AssertionError: assertion failed: Directory C:\git\CoreLibrary is not contained in build root C:\git\ApplicationA 

这似乎完全是简单,这个项目依赖性的正确方法是什么?

回答

41

你可以做你的项目一样,源依赖性:

lazy val core = RootProject(file("../CoreLibrary")) 

val main = Project(id = "application", base = file(".")).dependsOn(core) 

我有一个多模块发挥构建一个工作示例:https://github.com/ahoy-jon/play2MultiModule/blob/master/playapp/project/Build.scala

但我认为适当的方式(这取决于你的上下文)是创建一个

-> /project/ 
    -> Build.scala 
-> /ApplicationA 
    -> /project 
    -> /build.sbt 
-> /CoreLibrary 
    -> /project 
    -> /build.sbt 

引用两个项目和它们之间的依赖关系。

+0

第一种方法完美运作!谢谢!必须使用RootProject :) 第二种方法的问题是它们是2 github回购,所以为了让它们工作,您需要额外的一个在顶部或东西 – Diego 2012-07-25 16:28:21

+1

@Diego请参阅git submodule以获得单独的git在单一外部git回购下回购。 – 2012-07-25 22:22:52

+3

所谓的“正确的方式”是IMO的一个不好的解决方案。您不应该需要容器项目来声明两个兄弟之间的依赖关系。 – 2013-01-31 10:04:17

19

随着SBT 0.12.1似乎可以得到一个简单的参考项目:

我用ProjectRef代替RootProject

http://www.scala-sbt.org/0.12.1/api/sbt/ProjectRef.html

ProjectRef(file("../util-library"), "util-library") 

SBT-日食也适用。

+0

优秀!但只有当子项目使用相同版本的Scala时才有效。 – 2017-10-02 23:58:38

11

由于sbt 0.13,您可以直接在.sbt中创建多项目定义,而不需要Build.scala文件。

因此,将以下内容添加到ApplicationA/project/build.sbt就足够了。

lazy val core = RootProject(file("../CoreLibrary")) 

val main = Project(id = "application", base = file(".")).dependsOn(core)