Як управляти кількома взаємозалежними модулями за допомогою SBT та IntelliJ IDEA?


82

Я розробляю кілька модулів із залежностями серед них, і я хотів би працювати з усіма ними в одному проекті 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 із залежностями серед відстежуваних підпроектів. Однак є два застереження:

  1. Здається, обмеження sbt полягає в тому, що підпроекти повинні знаходитись у підкаталогах головного проекту (тобто, file("../foo")не дозволяється). Це насправді не те, що я хочу (що, якщо модуль - наприклад, пакет "utils" або "commons" - використовується у двох різних майстер-проектах?), Але я можу жити з ним.
  2. Один із моїх підпроектів має власні підпроекти; Я не впевнений, чи правильно sbt працює з цими вкладеними проектами, але в будь-якому випадку sbt-idea їх ігнорує. Очевидно, що мені потрібно, щоб вкладені підпроекти були рекурсивно включені в головний проект.

Підсумовуючи: я хотів би зібрати модулі, які вже можуть мати підпроекти, в один великий проект IDEA з відстежуваними залежностями для зручного редагування. Як я можу це зробити? Дякую!


2
Спробуйте налаштувати мета-проект, який посилається на інші як зовнішні посилання на проект ( github.com/harrah/xsbt/wiki/Full-Configuration ). Я сам не пробував цього за допомогою sbt-idea, тому це коментар, а не відповідь.
ретронім

Дякую за ідею, але, на жаль, sbt-idea повністю ігнорує зовнішні посилання.
David Soergel

Можливо, це допоможе у наступній версії sbt-idea: github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
ретронім

Класно, тому я встановив svn-idea з останніх джерел git, щоб втягнути ці зміни, потім очистив проекти і знову запустив sbt-idea. Були якісь дивні проблеми з вирішенням залежностей, які я не до кінця розумію, але я якось отримав робочий проект! Мені довелося вручну встановити вихідні папки в IDEA для підпроектів; а в ретроспективі я не впевнений, що не міг би зробити це в першу чергу із фондовою sbt-idea 11.1. У будь-якому разі, спасибі - я думаю, що я можу поки що голити цей як зараз.
David Soergel

Написавши останній коментар, я виявив, що у мене, зрештою, не було робочого проекту (знову ж таки, проблеми з підпроектами). Тож я просто розділив їх на першокласні проекти, тому мій головний проект зараз має лише один рівень підпроектів нижче. Звичайно, я міг це зробити лише тому, що це все мій власний код для початку.
David Soergel

Відповіді:


7

Підхід до побудови кількох проектів є правильним. Ви можете мати вкладене дерево підпроектів довільної довжини, але не можна мати модуль, що належить до кількох батьківських проектів. Це має абсолютно сенс, і в Maven відбувається те саме.

Причина полягає в тому, що було б важко мати один і той же модуль у кількох проектах та підтримувати синхронізацію джерел. Нормальний робочий процес такий:

  • У вас є проект, до якого належить модуль, де ви змінюєте джерело модуля.
  • Ви публікуєте модуль у своєму локальному сховищі
  • В інших проектах, де вам потрібен модуль, ви оголошуєте його як бібліотечну залежність

Якщо ви хочете завантажити модуль, який не належить поточному проекту, всередині Idea, це, однак, можливо, оскільки ви можете додати його як зовнішній модуль до робочої області:

  • SBT-IDEA створює файли .iml для вашого проекту, а ви імпортуєте їх у робочу область
  • Ви можете додати other.iml інших проектів до робочої області
  • Якщо ви модифікуєте зовнішні модулі SBT, які ви додали вручну до робочої області, вам слід перевидати їх, щоб отримати видимі зміни в "основному" проекті, який бачить, що ці зовнішні модулі є "бібліотечною залежністю"

Дякуємо за вступ. Однак проблема полягає в тому, що це не так, "Ви можете мати вкладене дерево підпроектів довільної довжини". Я погоджуюсь, що це повинно працювати з sbt, але sbt-idea, очевидно, не включає підпроекти в отриманий файл проекту IDEA.
Девід Соергель,

Це обмеження походить від ідеї?
Edmondo1984,

Ні, я, безумовно, зробив ієрархію проектів IDEA на кілька рівнів.
David Soergel

7

Здається, обмеження sbt полягає в тому, що підпроекти повинні знаходитись у підкаталогах головного проекту (тобто файл ("../ foo") не допускається). Це насправді не те, що я хочу (що, якщо модуль - наприклад, пакет "utils" або "commons" - використовується у двох різних майстер-проектах?), Але я можу жити з ним.

За допомогою sbt 13.5 та intellij 13.x ви можете вказати залежність між проектами із відносним шляхом, використовуючи Build.scala . Скажімо , у вас є два проекти, основною проект надбання і інший проект Foo , і життя в загальному каталозі коді /

  1. створити Build.scala під кодом / foo / project /
  2. помістіть цей фрагмент коду в 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. Створіть свій проект IntelliJ через sbt by sbt gen-idea


чи дозволить це редагувати "загальне" джерело шляхом посилання з "foo"?
Tjunkie

Так, це дозволяє. І це працює на моїй установці sbt 0.13.7 та intellij 14.0.3
user2829759 02.03.15
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.