Подтвердить что ты не робот

Как указать это для создания проекта. Сначала должен быть построен другой проект B?

Предположим, что у одного парня в моей компании есть проект 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, которые мы не можем вложить.

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

4b9b3361

Ответ 1

Вам нужно определить мультипроект в корневом проекте (или какое-либо имя, но это хорошо подходит), которое будет определено в 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.

Ответ 2

Вы должны использовать 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)

Ответ 3

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