2012-07-25 20 views
48

tengo la siguiente configuración de una aplicación de Scala y una biblioteca núcleo común: raíz¿Cómo hacer referencia al proyecto sbt externo desde otro proyecto sbt?

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

Quiero añadir una referencia de ApplicationA a CoreLibrary a la Eclipse de referencia del proyecto, por lo que cada vez CoreLibrary cambia ApplicationA es construido también. He tratado los siguientes contenidos de build.Scala para ApplicationA:

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

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

Sin embargo, cuando se compila ApplicationA SBT se queja de que una dependencia sólo puede ser un subdirectorio !!:

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

Esto parece completamente sencillo , ¿cuál es la forma correcta de tener esta dependencia de proyecto?

Respuesta

41

Usted puede hacer una dependencia de origen en el proyecto como ese:

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

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

tengo un ejemplo de trabajo con un juego multimódulo construcción: https://github.com/ahoy-jon/play2MultiModule/blob/master/playapp/project/Build.scala

Pero creo que la forma correcta (que depende de su contexto) de hacerlo es crear un

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

haciendo referencia a los dos proyectos y las dependencias entre ellos.

+0

¡El primer enfoque funcionó a la perfección! ¡Gracias! Tuve que usar RootProject :) El problema con el segundo enfoque es que son 2 repositorios github, por lo que para que funcionen necesitarás uno adicional en la parte superior o algo – Diego

+1

@Diego Ver el submódulo git para una manera fácil de tener git separados repos bajo un solo, exterior, git repo. –

+3

La llamada "forma correcta" es una solución deficiente IMO. No debería necesitar un proyecto contenedor para declarar la dependencia entre dos hermanos. –

19

Con 0.12.1 SBT parece posible conseguir una simple referencia a un proyecto:

que utilizan ProjectRef en lugar de RootProject

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

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

SBT-Eclipse también funciona.

+0

¡Excelente! Pero solo funciona si el subproyecto usa la misma versión de Scala. –

11

Desde SBT 0,13, puede crear definiciones de varios proyectos directamente en .sbt sin necesidad de un archivo Build.scala.

Añadiendo lo siguiente a ApplicationA/project/build.sbt sería suficiente.

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

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