Jak zarządzać wieloma współzależnymi modułami za pomocą SBT i IntelliJ IDEA?

82

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:

  1. 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ć.
  2. 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!

David Soergel
źródło
2
Spróbuj skonfigurować meta-projekt, który łączy się z innymi jako odniesienia do projektu zewnętrznego ( github.com/harrah/xsbt/wiki/Full-Configuration ). Nie próbowałem tego osobiście z pomysłem SBT, więc jest to raczej komentarz niż odpowiedź.
retronim
Dzięki za pomysł - ale niestety sbt-idea całkowicie ignoruje zewnętrzne odniesienia.
David Soergel,
Super, więc zainstalowałem svn-idea z najnowszych źródeł git, aby pobrać te zmiany, następnie wyczyściłem projekty i ponownie uruchomiłem sbt-idea. Było kilka dziwnych problemów z rozwiązywaniem zależności, których nie do końca rozumiem, ale w jakiś sposób skończyłem z działającym projektem! Musiałem ręcznie ustawić katalogi źródłowe w IDEA dla podprojektów; i patrząc z perspektywy czasu, nie jestem pewien, czy nie mógłbym tego zrobić w pierwszej kolejności z pomysłem sbt 11.1. W każdym razie dzięki ... Myślę, że mogę na razie przestać golić tego jaka.
David Soergel
Po napisaniu tego ostatniego komentarza stwierdziłem, że mimo wszystko nie mam działającego projektu (znowu kłopoty z podprojektami). Więc po prostu podzieliłem je na projekty pierwszej klasy, więc mój projekt główny ma teraz tylko jeden poziom podprojektów poniżej. Oczywiście mogłem to zrobić tylko dlatego, że na początku jest to mój własny kod.
David Soergel,

Odpowiedzi:

7

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:

  • Masz projekt, do którego należy moduł, w którym modyfikujesz źródło modułu.
  • Publikujesz moduł w swoim lokalnym repozytorium
  • W innych projektach, w których potrzebujesz modułu, deklarujesz go jako LibraryDependency

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:

  • SBT-IDEA generuje pliki .iml dla twojego projektu i importujesz je do obszaru roboczego
  • Możesz dodać other.iml innych projektów do obszaru roboczego
  • Jeśli zmodyfikujesz zewnętrzne moduły SBT, które ręcznie dodałeś do obszaru roboczego, powinieneś opublikować je ponownie, aby zmiany były widoczne w „głównym” projekcie, który widzi te zewnętrzne moduły jako „zależność od biblioteki”
Edmondo1984
źródło
Dzięki za wkład. Problem polega jednak na tym, że nie jest tak, że „możesz mieć zagnieżdżone drzewo podprojektów o dowolnej długości”. Zgadzam się, że to powinno działać z sbt, ale sbt-idea najwyraźniej nie zawiera podprojektów w wynikowym pliku projektu IDEA.
David Soergel
Czy to ograniczenie wynika z pomysłu?
Edmondo 1984,
Nie, z pewnością stworzyłem hierarchie projektów IDEA na kilka poziomów.
David Soergel,
7

Wydaje się, że ograniczeniem sbt jest to, że podprojekty muszą znajdować się w podkatalogach projektu głównego (tj. Plik („../ foo”) jest niedozwolony). Nie jest to tak naprawdę 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ć.

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 /

  1. utwórz Build.scala pod kodem / foo / project /
  2. 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)
    }
    
  3. Wygeneruj swój projekt IntelliJ przez sbt by sbt gen-idea

user2829759
źródło
czy pozwoli to na edycję źródła „commons” poprzez linkowanie z „foo”?
Tjunkie
Tak, to pozwala. I działa na mojej instalacji sbt 0.13.7 i intellij 14.0.3
user2829759