Я разрабатываю несколько модулей с зависимостями между ними и хотел бы работать со всеми ними вместе в одном проекте IDEA. Я использую sbt-idea для создания проектов IDEA из определений сборки sbt, что отлично подходит для отдельных проектов. Однако в случае с несколькими модулями то, что я пробовал до сих пор, не совсем работает:
Используйте sbt-idea для создания файла IDEA .iml для каждого модуля независимо ; затем создайте главный проект IDEA с нуля и добавьте в него эти модули. Это делает все источники модуля доступными для редактирования в одном окне, но зависимости между ними не отслеживаются (поэтому попытка перехода из какого-либо источника в проекте foo к чему-то в bar приводит меня к импортированной библиотечной версии bar , а не к локальным источникам ).
Используйте многопроектные сборки sbt (также известные как подпроекты) , где Build.scala родительского проекта содержит такие вещи, как:
lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)
Это почти работает, поскольку sbt-idea генерирует главный проект IDEA с отслеживаемыми зависимостями между подпроектами. Однако есть два предостережения:
- Кажется, что это ограничение sbt, что подпроекты должны находиться в подкаталогах главного проекта (т. Е.
file("../foo")
Не разрешено). Это не совсем то, что я хочу (что, если модуль - такой как «utils» или «commons» пакет - используется в двух разных главных проектах?), Но я могу жить с этим. - Один из моих подпроектов имеет свои собственные подпроекты; Я не уверен, правильно ли сам sbt справляется с этими вложенными проектами, но в любом случае они игнорируются sbt-idea. Очевидно, мне нужно, чтобы вложенные подпроекты рекурсивно включались в главный проект.
Подводя итог: я хотел бы собрать модули, которые могут уже иметь подпроекты, в один большой проект IDEA с отслеживаемыми зависимостями для удобного редактирования. Как мне это сделать? Благодаря!
источник
Ответы:
Подход с многопроектной сборкой - правильный. Вы можете иметь вложенное дерево подпроектов произвольной длины, но не можете иметь модуль, принадлежащий нескольким родительским проектам. В этом есть смысл, и в Maven происходит то же самое.
Причина в том, что было бы сложно использовать один и тот же модуль в нескольких проектах и синхронизировать источники. Обычный рабочий процесс следующий:
Если вы хотите загрузить модуль, который не принадлежит текущему проекту внутри Idea, это возможно, так как вы можете добавить его как внешний модуль в рабочую область:
источник
С sbt 13.5 и intellij 13.x вы можете указать межпроектную зависимость с относительным путем, используя Build.scala . Предположим, у вас есть два проекта: основной проект commons и еще один проект foo , которые находятся в общем каталоге code /
поместите этот фрагмент кода в 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) }
Создайте свой проект IntelliJ через sbt с помощью
sbt gen-idea
источник