2014-08-31 13 views
8

Ich habe in ein paar verwandte Fälle mit SBT, die mich ratlos sind gerannt. Gibt es eine Möglichkeit, SBT mitzuteilen, ein Teilprojekt für bestimmte Scala-Versionen komplett zu überspringen, wenn Sie Cross-Compiling durchführen?Wie kann SBT die Kreuzkompilierung für ein bestimmtes Unterprojekt überspringen?

Hier sind zwei Beispiele, wo dies nützlich wäre.

1) Ein Build mit drei Projekten A, B und C. Sowohl A als auch B sind Scala-Projekte und haben 'scalaVersions ++ = Seq ("2.11.2", "2.10.4") in ihren Einstellungen . Projekt C ist ein reines Java-Artefakt, und daher habe ich die Scala-Bibliotheken von ihren Abhängigkeiten ausgeschlossen. Ich möchte, dass A und B von C abhängen, aber im Idealfall möchte ich C nur einmal bauen. Wenn ich das Standardverhalten verwende und "+ publish" aus dem Root-Aggregator-Projekt mache, erhalte ich zwei Kopien von C-1.0.0.jar, und SBT versucht, sie zweimal zu veröffentlichen, was natürlich ein No-No für ein ist Maven Repository.

2) Ein Build mit mehreren Scala-Projekten, aber ein Projekt sollte nur mit einer einzigen Scala-Version erstellt werden. Ich habe versucht, 'scalaVersions' in den Einstellungen für dieses Projekt zu definieren, um nur eine Version zu speichern, wo die anderen Projekte zwei haben, aber wieder "+ publish" von einem Root-Aggregator ignoriert dies und kompiliert es immer noch zweimal, zum zweiten Mal fehlgeschlagen, da Abhängigkeiten für diese Scala-Version nicht verfügbar sind. Dieses Projekt ist ein Blattknoten in der Abhängigkeitsgrafik, also ist es eine absolut feine Sache, die man logisch tun möchte.

Für Fall # 2 habe ich überlegt, die Source-Verzeichnisse für die 'schlechte' Scala-Version auf/dev/null oder etwas Ähnliches einzustellen, aber das führt immer noch den Build und erzeugt ein leeres Artefakt. Ich weiß, dass ich wahrscheinlich in gehen könnte und alle relevanten Schlüssel finden und etwas tun, wie

publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value 

und dann alle anderen zugehörigen Einstellungen/Aufgaben jagen (kompilieren, kompilieren in Test, Test in Test, packageBin, usw.), aber das scheint ziemlich hack-ish. Gibt es irgendwo eine Einstellung zum "Überspringen"?

Antwort

4

Ich schrieb sbt-doge Aufgabe Aggregation über Teilprojekte zu adressieren ihre crossScalaVersions respektieren. Für Java-Projekte benötigen Sie möglicherweise einen Dummy-Eintrag crossScalaVersion.

+0

Das sieht sehr nützlich, aber ich bin offen leery „so viel Test“ des Hinzufügens und so zu meinem Build: -/ –

+0

Und ich völlig verfehlt die „sensible“ Alternative in 0.1.4. Ich entschuldige mich, Sir! Das funktioniert wie ein Zauber! –

+0

@Tomer Welche Tests und "sinnvolle Alternative" meinen Sie? – matanster

1

Mit dem Plugin sbt-doge kann in jedem Teilprojekt eine crossScalaVersion Einstellung festgelegt werden.

Fügen Sie zuerst die Zeile addSbtPlugin("com.eed3si9n" % "sbt-doge" % "0.1.5") zu Ihrer projects/plugins.sbt hinzu.

Um die lächerliche Doge-Syntax ("solche Kompilieren", wirklich?) Zu vermeiden, müssen Sie enablePlugins(CrossPerProjectPlugin) in Ihrem Root-Projekt. Damit können Sie vor Ihren sbt-Befehlen ein Pluszeichen hinzufügen, das die Cross-Build-Einstellungen berücksichtigt. Einfach so: + compile.

Verwandte Themen