scala - para - ¿Cómo administrar múltiples módulos interdependientes con SBT e IntelliJ IDEA?
plugins in intellij (2)
Parece ser una restricción sbt que los subproyectos deben vivir en subdirectorios del proyecto maestro (es decir, el archivo ("../ foo") no está permitido). Esto no es realmente lo que quiero (¿qué pasa si un módulo, como un paquete de "utils" o "commons", se usa en dos proyectos principales diferentes?) Pero puedo vivir con él.
Con sbt 13.5 e intellij 13.x, puede especificar la dependencia entre proyectos con la ruta relativa, utilizando Build.scala . Digamos que tiene dos proyectos, un proyecto principal común y otro proyecto foo , ambos viviendo en un código de directorio común /
- crea Build.scala bajo el código / foo / project /
poner este fragmento de código en el sitio Build.scala
object ProjectDependencies { val commons = RootProject(file("../commons")) } object ProjectBuild extends Build { import ProjectDependencies._ lazy val root = Project(id = "foo", base = file(".")).dependsOn(commons) }
Genera tu proyecto IntelliJ a través de sbt por
sbt gen-idea
Estoy desarrollando varios módulos con dependencias entre ellos, y me gustaría trabajar con ellos en un solo proyecto de IDEA. Estoy usando sbt-idea para generar proyectos IDEA a partir de las definiciones de compilación sbt, que funciona muy bien para proyectos individuales. En el caso de módulos múltiples, sin embargo, las cosas que he intentado hasta ahora no funcionan del todo:
Utilice sbt-idea para generar un archivo .iml IDEA para cada módulo de forma independiente ; luego crea un proyecto maestro IDEA desde cero y agrega esos módulos a él. Esto hace que las fuentes del módulo sean totalmente editables en la misma ventana, pero las dependencias entre ellas no se rastrean (por lo que intentar navegar de alguna fuente dentro del proyecto foo a algo en la barra me lleva a la versión de biblioteca importada de la barra , no a las fuentes locales )
Utilice las compilaciones de proyectos múltiples de sbt (también conocidos como subproyectos) , donde Build.scala del proyecto principal contiene cosas como:
lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)
Esto casi funciona, en esa sbt-idea genera un proyecto maestro IDEA con las dependencias entre los subproyectos rastreados. Sin embargo, hay dos advertencias:
- Parece ser una restricción sbt que los subproyectos deben vivir en subdirectorios del proyecto maestro (es decir, el
file("../foo")
no está permitido). Esto no es realmente lo que quiero (¿qué pasa si un módulo, como un paquete de "utils" o "commons", se usa en dos proyectos principales diferentes?) Pero puedo vivir con él. - Uno de mis subproyectos tiene sus propios subproyectos; No estoy seguro de si sbt se ocupa de estos proyectos anidados correctamente, pero en cualquier caso son ignorados por sbt-idea. Obviamente necesito que los subproyectos anidados se incluyan recursivamente en el proyecto maestro.
Para resumir: me gustaría recopilar módulos que pueden tener subproyectos en un gran proyecto de IDEA con dependencias rastreadas para una edición conveniente. ¿Cómo puedo hacerlo? ¡Gracias!
El enfoque con la construcción de proyectos múltiples es el correcto. Puede tener un árbol anidado de subproyectos de longitud arbitraria, pero no puede tener un módulo que pertenezca a proyectos principales múltiples. Esto tiene mucho sentido, y en Maven sucede lo mismo.
La razón es que sería difícil tener el mismo módulo en múltiples proyectos y mantener las fuentes sincronizadas. Un flujo de trabajo normal es el siguiente:
- Tiene un proyecto al que pertenece el módulo, donde modifica el origen del módulo.
- Usted publica el módulo en su repositorio local
- En otros proyectos donde necesita el módulo, lo declara como una bibliotecaDependencia
Si desea cargar un módulo que no pertenece al proyecto actual dentro de Idea, esto es posible, ya que puede agregarlo como un módulo externo al espacio de trabajo:
- SBT-IDEA genera los archivos .iml para su proyecto y los importa en el área de trabajo
- Puede agregar other.iml de otros proyectos al área de trabajo
- Si modifica los módulos SBT externos que ha agregado manualmente al área de trabajo, debe volver a publicarlos para que los cambios sean visibles en el proyecto "principal", que considera que esos módulos externos son una "bibliotecaDependencia".