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

SBT: зависимость от другого проекта SBT без публикации

У меня есть набор слабо связанных компонентов, где некоторые из них зависят от других. Для конкретности давайте предположим, что у нас есть компоненты "common", "a" и "b" . "common" не имеет никаких зависимостей, но все остальные проекты используют "общие". Кроме того, "а" зависит от "b" . Все компоненты написаны в Scala, и я хотел бы использовать sbt для их создания.

Было бы неплохо иметь следующие свойства:

  • Несколько человек работают над разными проектами, поэтому мы не хотим иметь один репозиторий, а скорее один репозиторий для каждого проекта.
  • Построение проекта должно быть простым, и все зависимости должны быть построены автоматически (при необходимости). То есть, если я изменяю "общий", а затем строю "b" , это должно сначала построить "общий", а затем продолжить сборку "b" .
  • Уметь иметь все проекты в среде IDE, так что рефакторинг и подобные IDE-задачи будут работать правильно, и все затронутые проекты будут изменены правильно.

Насколько я вижу, есть две возможности иметь зависимости такого рода в sbt; либо мы используем подпроекты, либо используем управляемую зависимость (которая перемещается где-то, например, локально). Тем не менее, похоже, что оба этих варианта не предусматривают (1) или (2) выше. В частности,

  • Использование подпроектов заставляет нас использовать один репозиторий, потому что весь подпроект должен быть в подкаталогах основного проекта.
  • Публикация проектов локально и использование управляемых зависимостей громоздка, поскольку изменение "общего", а затем построение "b" только подбирает изменения в "общем", если этот проект был создан и опубликован первым. Я вижу, что управляемые зависимости полезны для многих случаев, но для нашего конкретного случая использования они, похоже, не работают хорошо. Мы часто работаем над несколькими проектами и одновременно меняем их. По этой причине публикация часто кажется слишком сложной.

Нет ли способа сказать, что проект sbt зависит от другого sbt-проекта в определенном (относительном) местоположении и имеет значение sbt, когда нужно построить зависимость?

4b9b3361

Ответ 1

С SBT вы можете использовать исходные зависимости.

lazy val root = Project("root", file("."), settings = ...) dependsOn(dispatchLiftJson)

lazy val dispatchLiftJson = uri("git://github.com/dispatch/dispatch-lift-json#0.1.0")

В этом примере он будет извлекаться из git. Вы можете указать местоположение файла на диске, хотя я не могу найти примеры. Возможно

lazy val dep = file("/path/to") 

или

lazy val dep = uri("file:///path/to")

Я борюсь с этим сам - на данный момент я использую локально-локальный метод, который работает нормально.

Ответ 2

Данные каталоги

  • /build/some_app/
  • /build/some_lib/

Файл /build/some_app/build.sbt:

lazy val someLib = ProjectRef(file("../some_lib"), "exportedSomeLib")
// = RootProject(file("../some_lib")) also works?

lazy val root = (project in file("."))
                .dependsOn(someLib)

В /build/some-lib/build.sbt:

lazy val exportedSomeLib = (project in file("."))

Предостережение: обратите внимание, что элементы, определенные в обеих корневых областях этих файлов, не всегда приводят к ошибкам, но незаметно изменяют значения в глобальной области (?), Если ключи (= имена значений) конфликтуют между файлами .sbt. 😞