2016-06-30 47 views
0

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 in B/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).

Antwort

1

Als Erstes können Sie Versionen für Ihre Abhängigkeiten in Ivy dynamic version format bereitstellen. Zum Beispiel "1.2. +" Oder "neueste.integration".

Um an einer bestimmten Version der Abhängigkeit zu bleiben, könnten Sie sbt-lock plugin verwenden.Dieses Plugin ermöglicht es Ihnen, dynamische Version nicht in build.sbt Datei zu 'sperren', sondern zusätzlich lock.sbt Datei. Es empfiehlt sich, diese Datei der Versionskontrolle zu unterstellen. Mit den Plugins 'unlock' und 'relock' können Sie gesperrte Versionen später ändern.

+0

danke, aber ist es auch möglich, einen Ordner mit lokalen Änderungen anstelle einer Version bereitzustellen? Wie ist es mit 'dependsOn' gemacht? –

+0

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? –

+0

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. –