Как указать, что для построения проекта A сначала должен быть построен другой проект B? - PullRequest
12 голосов
/ 30 ноября 2011

Предположим, у одного парня в моей компании есть проект sbt под названием commons, который довольно общего назначения. Этот проект определяется традиционным способом sbt: в главной папке с определением сборки в project/Build.scala файле.

Теперь какой-то другой парень разрабатывает проект под названием databinding, который зависит от commons. Мы хотим определить этот проект таким же образом, с project/Build.scala.

У нас есть следующая структура каталогов:

dev/
  commons/
    src/
      *.scala files here...
    project/
      Build.scala
  databinding/
    src/
      *.scala files here...
    project/
      Build.scala

Как я могу указать, что databinding требует, чтобы commons сначала был собран и использовать файлы выходных классов?

Я прочитал Многопроектные сборки и предложил следующее для определения сборки databinding:

object MyBuild extends Build {

  lazy val root = Project(id = "databinding", base = file(".")) settings (
    // ... omitted
  ) dependsOn (commons)

  lazy val common = Project(id = "commons",
    base = file("../commons")
  )

}

За исключением того, что он не работает: sbt не нравится .. и выдает ошибку AssertionError. Очевидно, commons должна быть папкой внутри databinding. Но эти два проекта хранятся в отдельных репозиториях git, которые мы не можем вкладывать.

Как правильно определить эту зависимость?

Ответы [ 3 ]

12 голосов
/ 30 ноября 2011

Вам нужно определить мультипроект в корневом проекте (или как угодно, но это имя подходит), которое будет определено в dev/project/Build.scala.

object RootBuild extends Build {
  lazy val root = Project(id = "root", base = file("."))
    .settings(...)
    .aggregate(commons, databinding)

  lazy val commons = Project(id = "commons", base = file("commons"))
    .settings(...)

  lazy val databinding = Project(id = "databinding", base = file("databinding"))
    .settings(...)
    .dependsOn(commons)
}

еще одна вещь, SBT не поддерживает *.scala конфигурационные файлы в подпроектах. Это означает, что вам придется перенести конфигурацию, которую вы сделали на commons/project/Build.scala и databinding/project/Build.scala, в соответственно commons/build.sbt и databinding/build.sbt.

Если некоторые из ваших настроек не подходят для файла определения .sbt, вам придется добавить их в корень project/Build.scala. Очевидно, что настройки, определенные в корне Build.scala, доступны в *.sbt файлах.

10 голосов
/ 22 марта 2013

Вы должны использовать RootProject (в случае ссылки на корневой проект другого проекта) или ProjectRef (в случае ссылки на подпроект другого проекта).

Вот пример использования RootProject:

       lazy val commons = RootProject(file("../commons"))
       lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons)

А вот пример использования ProjectRef

       lazy val commons = ProjectRef(file("../commons"), "sub-project")
       lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons)
1 голос
/ 01 декабря 2011

Вы можете иметь два отдельных проекта и просто опубликовать один из них локально, добавив его как обычную библиотечную зависимость к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...