2013-10-31 6 views
5

Ich habe mehrere SBT 0.13/Play 2.2-Projekte (Websites). Sie sind alle multi-Modul, da sie einige gemeinsame Funktionen teilen. Dies macht ihre Projektkonfigurationsdateien sowohl komplex als auch fast identisch, aber nicht ganz.Wie verwende ich gemeinsame Konfigurationen über SBT (Play) Multi-Projekte?

Ich würde gerne in der Lage sein, so viel wie möglich von diesen Konfigurationsdateien über die Projekte hinweg zu teilen (häufiges Play-Update macht das Aktualisieren von über 5 Websites zu einem königlichen Schmerz, ganz zu schweigen von den fast identischen - aber Entwicklung von Abhängigkeitslisten über die Projekte hinweg).

build.properties und plugins.sbt sind projektübergreifend identisch und können mit einem einfachen Skript überschrieben werden. Groß.

Build.scala ist kniffliger - Ich möchte eine gemeinsame Basisklasse einzuführen, etwa so:

abstract class MyBuildBase extends Build { ... } 

dass in Build.scala tun:

object ApplicationBuild extends MyBuildBuild { ... } 

Damit dies jeder machen Sinn überhaupt, MyBuildBase.scala muss über Projekte hinweg geteilt werden. Dies kann mit svn: external geschehen, das auf Verzeichnissen operiert. Was bedeutet, dass ich dieses freigegebene Verzeichnis irgendwie zugänglich machen muss, wenn Build.scala kompiliert wird (sonst beklagt sich sbt laut).

Lesen http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Classpaths.html und http://www.scala-sbt.org/0.13.0/docs/Getting-Started/Full-Def.html es scheint, wie dies möglich sein sollte.

Es ist jedoch außergewöhnlich unklar für mich, was tatsächlich in die Projekt/Projekt/Build.scala-Datei zu setzen, um dies tatsächlich zu erreichen - ich kann kein Beispiel für finden "eine sbt Build-Datei, die ein bauen soll sbt Build-Datei und einige zusätzliche Quelldateien in den Build ".

Irgendwelche Vorschläge?

Antwort

6

Was Sie wahrscheinlich tun möchten, ist ein Plugin oder eine gemeinsame Bibliothek zu erstellen.

Sie können ein SBT-Projekt mit einem Build machen wie folgt:

build.sbt

sbtPlugin := true 

organization := "you" 

name := "common-build" 

version := "1.0" 

dann in src/main/scala Ihre abstrakte Klasse "MyBuildBase" erstellen. Geben Sie dieses Projekt als sbt-Plugin frei.

Dann in Ihren anderen Projekten können Sie dies als Bibliothek/Plugin verwenden. In project/plugins.sbt hinzufügen:

addSbtPlugin("you" % "common-build" % "1.0") 

Und das wird Ihre Common-Build-Bibliothek lösen, wenn Ihr Build Aufbau.

Wenn Sie weitere Informationen benötigen, sehen Sie mehr über sbt-Plugins nach und ignorieren Sie den Teil über das Erstellen von etwas, das ein Plugin erweitert. Plugins sind nur Bibliotheken, die mit der Versionsnummer von sbt und Ihrer eigenen Versionsnummer versehen sind. Sie sollten in der Lage sein, den von Ihnen gewünschten Code für die Freigabe zwischen den Builds zu verwenden.

+0

Hervorragender Vorschlag. Es stellte sich heraus, dass SVN seit v1.6 mit externen Dateien und nicht nur mit Verzeichnissen umgehen kann, also habe ich es stattdessen so gelöst, wie es in meinem speziellen Fall einfacher war. Ihre Antwort bezieht sich jedoch auf die Frage, die ich tatsächlich gestellt habe, also als solche. – Jxtps