Как указать это для создания проекта. Сначала должен быть построен другой проект 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, которые мы не можем вложить.
Как можно правильно определить эту зависимость?
Ответы
Ответ 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
У вас может быть два отдельных проекта, и просто опубликуйте один из них локально, добавив его как нормальную зависимость библиотеки к другой.