Tworzę kilka modułów z zależnościami między nimi i chciałbym pracować z nimi wszystkimi w jednym projekcie IDEA. Używam sbt-idea do generowania projektów IDEA z definicji kompilacji sbt, co świetnie sprawdza się w przypadku indywidualnych projektów. Jednak w przypadku wielu modułów rzeczy, których próbowałem do tej pory, nie działają:
Użyj sbt-idea do wygenerowania pliku IDEA .iml dla każdego modułu niezależnie ; następnie utwórz od podstaw główny projekt IDEA i dodaj do niego te moduły. To sprawia, że wszystkie źródła modułów są edytowalne w tym samym oknie, ale zależności między nimi nie są śledzone (więc próba nawigacji z jakiegoś źródła w projekcie foo do czegoś w pasku przenosi mnie do zaimportowanej wersji biblioteki bara , a nie do źródeł lokalnych ).
Użyj kompilacji wielu projektów SBT (zwanych również podprojektami) , gdzie Build.scala projektu nadrzędnego zawiera takie rzeczy, jak:
lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)
To prawie działa, ponieważ sbt-idea generuje główny projekt IDEA z zależnościami między śledzonymi podprojektami. Istnieją jednak dwa zastrzeżenia:
- Wydaje się, że ograniczeniem SBT jest to, że podprojekty muszą znajdować się w podkatalogach projektu głównego (tj.
file("../foo")
Jest to niedozwolone). To nie jest to, czego chcę (co jeśli moduł - taki jak pakiet „utils” lub „commons” - jest używany w dwóch różnych głównych projektach?), Ale mogę z tym żyć. - Jeden z moich podprojektów ma własne podprojekty; Nie jestem pewien, czy sam sbt radzi sobie z tymi zagnieżdżonymi projektami poprawnie, ale w każdym razie są one ignorowane przez sbt-idea. Oczywiście potrzebuję zagnieżdżonych podprojektów, które mają być uwzględnione rekurencyjnie w projekcie głównym.
Podsumowując: chciałbym zebrać moduły, które mogą już mieć podprojekty w jeden duży projekt IDEA ze śledzonymi zależnościami w celu wygodnej edycji. Jak mogę to zrobić? Dzięki!
źródło
Odpowiedzi:
Podejście do kompilacji wielu projektów jest właściwe. Możesz mieć zagnieżdżone drzewo podprojektów o dowolnej długości, ale nie możesz mieć modułu należącego do wielu projektów nadrzędnych. Ma to absolutny sens, aw Maven dzieje się to samo.
Powodem jest to, że trudno byłoby mieć ten sam moduł w wielu projektach i synchronizować źródła. Normalny przepływ pracy jest następujący:
Jeśli chcesz załadować moduł, który nie należy do bieżącego projektu w Idea, jest to jednak wykonalne, ponieważ możesz dodać go jako moduł zewnętrzny do obszaru roboczego:
źródło
W przypadku sbt 13.5 i intellij 13.x można określić zależności między projektami za pomocą ścieżki względnej, używając Build.scala . Załóżmy, że masz dwa projekty, wspólny projekt podstawowy i inny projekt foo , oba mieszkające we wspólnym kodzie katalogu /
umieść ten fragment kodu insde 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) }
Wygeneruj swój projekt IntelliJ przez sbt by
sbt gen-idea
źródło