Unser Projekt besteht aus mehreren Teilprojekten, die wir in einem lokalen Nexus veröffentlichen. Wenn Sie jetzt an einer Bibliothek arbeiten, möchten wir diese Bibliothek verwenden und die Anwendung erstellen, ohne diese Bibliothek ständig auf Nexus hochladen zu müssen.pinning Abhängigkeit Version zu Ordner mit sbt/ivy
Für ein prototypisches Beispiel betrachten wir zwei Projekte A und B, mit B je nach A:
A/build.sbt:
version := 0.1.7
organization := "org.example"
name := "libraryA"
scalaVersion := "2.11.8"
libraryDependencies += "some.external" % "dependency" % "0.1"
B/build.sbt:
version := 0.2.3
organization := "org.example"
name := "applicationB"
scalaVersion := "2.11.8"
libraryDependencies += "some.other.external" % "dependency" % "0.2"
libraryDependencies += "org.example" % "libraryA" % "0.1.7"
Jetzt sagen wir, ich möchte mit BibliothekA arbeiten und meine Änderungen testen, indem ich AnwendungB ausführen. Also schaue ich mir A und B in einigen lokalen Ordnern an. Unsere aktuellen Ansätze sind:
Erhöhung der Versionsnummer in
A/build.sbt
und die Abhängigkeit inB/build.sbt
. Dann tun(cd A && sbt publishLocal) && (cd B && sbt compile)
Die Version Inkrementierung nicht notwendig sein kann, wenn eine -snapshot Version verwenden (aber ich bin mir nicht sicher darüber); In jedem Fall müssen wir den Aufruf publishLocal ausführen.
fügen Sie eine neue
build.sbt
, dass beide Projekte A und B enthalten:lazy val A = (project in file("A")).settings( version := 0.1.7-SNAPSHOT, organization := "org.example", name := "libraryA", scalaVersion := "2.11.8", libraryDependencies += "some.external" % "dependency" % "0.1" ) lazy val B = (project in file("B")).settings( version := "0.2.3", organization := "org.example" name := "applicationB" scalaVersion := "2.11.8" libraryDependencies += "some.other.external" % "dependency" % "0.2" ).dependsOn(A)
Dies hat den Nachteil, dass für jede Kombination von Anwendungen/Bibliotheken wir zur Zeit hacken auf wollen, müssen wir eine neue
build.sbt
erstellen Datei und auch das hat eine Menge Duplikationen von den anderen build.sbt Dateien.Aber es hat den Vorteil, dass wir jetzt nur
sbt B/compile
schreiben müssen, um die Anwendung mit der modifizierten Bibliothek zu kompilieren.
Was wir im Idealfall haben wollen, ist eine Möglichkeit, um Stift spezifische Bibliotheksversionen auf bestimmte Ordner. Dies sollte eine Abhängigkeit in dem transitiven Graphen zu der spezifischen Version beheben, und es sollte möglich sein, dass dies ein Ordner ist, der dann kompiliert wird. Der Prozess soll wie folgt aussehen:
- Check-out A und B
- in Ordnern B, tut
sbt pin "org.example%libraryA%0.1.7" folder/A
- dann wollen wir jedes Mal Anwendung B mit der aktuellen Version der Bibliothek kompilieren, nur tun
sbt compile
.
Gibt es sowas in sbt? Mein Kollege hat mir gesagt, dass ocaml so etwas hat (es heißt).
danke, aber ist es auch möglich, einen Ordner mit lokalen Änderungen anstelle einer Version bereitzustellen? Wie ist es mit 'dependsOn' gemacht? –
Fügen Sie einfach den Ordner "projectA/src/main" als sourcesDirectory in B's build.sbt hinzu? Oder fügen Sie compiled jar als unmanagedJars in B hinzu? –
Hm, wenn ich dich richtig verstehe, würde dies "A/build.sbt" überhaupt nicht beinhalten; Wenn ich also eine kompliziertere 'build.sbt' habe, müsste ich sie mit' B.sbt' duplizieren. Das hört sich nicht nach der richtigen Lösung an. Kompiliertes jar könnte funktionieren, aber dann müssten wir immer noch "cd A && sbt kompilieren" vor "sbt kompilieren" in "B" machen, so dass ich nicht wirklich den Vorteil davon für den ersten Ansatz sehe (dh mit 'publishLocal') mit einer Snapshot-Version. Dennoch, es ist eine Menge Änderung von build.sbt Dateien. Im Idealfall möchte ich einfach ein paar Kommandos/envvar/different-Dateien (wie mit 'lock.sbt') verwenden, um ein lokales Projekt zu kompilieren. –