Comment gérer plusieurs modules interdépendants avec SBT et IntelliJ IDEA?

Je développe plusieurs modules avec des dépendances entre eux et j’aimerais travailler avec eux tous ensemble dans un projet IDEA. J’utilise sbt-idea pour générer des projets IDEA à partir des définitions de construction sbt, ce qui convient parfaitement aux projets individuels. Dans le cas des modules multiples, cependant, les choses que j’ai essayées jusqu’ici ne fonctionnent pas vraiment:

Utilisez sbt-idea pour générer un fichier IDEA .iml pour chaque module indépendamment ; puis créez un projet IDEA maître à partir de zéro et ajoutez-y ces modules. Cela rend les sources de modules toutes modifiables dans la même fenêtre, mais les dépendances entre elles ne sont pas suivies (donc essayer de naviguer depuis une source dans le projet foo vers quelque chose dans la barre me mène à la version de bibliothèque imscope de bar , pas aux sources locales) ).

Utilisez les versions multi-projets sbt (ou sous-projets) , où Build.scala du projet parent contient des éléments tels que:

lazy val foo = Project(id = "foo", base = file("foo")) lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo) 

Cela fonctionne presque, dans la mesure où sbt-idea génère un projet IDEA maître avec les dépendances entre les sous-projets suivis. Il y a cependant deux mises en garde:

  1. Il semble que les sous-projets doivent vivre dans des sous-répertoires du projet maître (c.-à-d. Que le file("../foo") n’est pas autorisé). Ce n’est pas vraiment ce que je veux (et si un module – tel qu’un package “utils” ou “commons” – est utilisé dans deux projets maîtres différents?) Mais je peux vivre avec.
  2. Un de mes sous-projets a ses propres sous-projets; Je ne suis pas sûr que sbt elle-même traite correctement ces projets nesteds, mais en tout cas ils sont ignorés par sbt-idea. De toute évidence, j’ai besoin de sous-projets nesteds à inclure récursivement dans le projet maître.

En résumé: je voudrais collecter des modules qui peuvent déjà comporter des sous-projets dans un grand projet IDEA avec des dépendances suivies pour une édition pratique. Comment puis-je le faire? Merci!

Il semble que les sous-projets doivent vivre dans des sous-répertoires du projet maître (c.-à-d. Que le fichier (“../ foo”) n’est pas autorisé). Ce n’est pas vraiment ce que je veux (et si un module – tel qu’un package “utils” ou “commons” – est utilisé dans deux projets maîtres différents?) Mais je peux vivre avec.

Avec sbt 13.5 et intellij 13.x, vous pouvez spécifier une dépendance entre projets avec un chemin relatif, en utilisant un build.scala . Disons que vous avez deux projets, un projet commun , un projet commun et un autre projet, tous deux vivant dans un code de répertoire commun /

  1. créer Build.scala sous code / foo / project /
  2. mettre cet extrait de code 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. Générez votre projet IntelliJ via sbt par sbt gen-idea

L’approche avec la construction multi-projets est la bonne. Vous pouvez avoir un arbre nested de sous-projets de longueur arbitraire, mais vous ne pouvez pas avoir de module appartenant à plusieurs projets parents. Cela est tout à fait logique, et chez Maven, c’est pareil.

La raison en est qu’il serait difficile d’avoir le même module dans plusieurs projets et de garder les sources synchronisées. Un stream de travail normal est le suivant:

  • Vous avez un projet auquel le module appartient, où vous modifiez la source du module.
  • Vous publiez le module dans votre référentiel local
  • Dans les autres projets où vous avez besoin du module, vous le déclarez en tant que bibliothèque

Si vous souhaitez charger un module qui n’appartient pas au projet en cours dans Idea, cela est cependant possible car vous pouvez l’append en tant que module externe à l’espace de travail:

  • SBT-IDEA génère les fichiers .iml pour votre projet et vous les importez dans l’espace de travail
  • Vous pouvez append other.iml d’autres projets à l’espace de travail
  • Si vous modifiez des modules SBT externes que vous avez ajoutés manuellement à l’espace de travail, vous devez les republier pour que les modifications soient visibles sur le projet “principal”, qui voit ces modules externes comme une “bibliothèque”.