Wie kann sbt Abhängigkeitsartefakte aus git ziehen?

102

Ich habe gehört (und ich weiß, dass ich auch Beispiele gesehen habe, wenn ich mich nur daran erinnern kann, wo), dass sbtAbhängigkeiten von einem Git-Repo erhalten werden können.

Ich suche nach der Abhängigkeit harrah / up von github. Das Repository stellt keine Artefakt-JAR-Dateien bereit, sondern nur einen Quellbaum, der für die Erstellung mit erstellt wurde sbt. Der Prozess, den ich mir vorstelle, besteht darin, sbtdas Quell-Repo herunterzuladen, es zu erstellen und es dann als Abhängigkeitsartefakt zu verwenden.

Ich kann mir vorstellen, dass sbtdas tatsächlich so etwas kann. Kann es? Und wenn ja, wie?

Owen
quelle

Antworten:

77

Ja in der Tat. Sie können Projectdem dependsOnOperator eine Abhängigkeit geben und ein Github-Projekt beispielsweise anhand seines URI referenzieren RootProject(uri("git://github.com/dragos/dupcheck.git")). Alternativ können Sie git clonedas Projekt erstellen und dann auf Ihre lokale Kopie mit verweisen RootProject(file(...)). Weitere Informationen und Beispiele finden Sie unter "Vollständige Konfiguration" im SBT-Wiki.

Kipton Barros
quelle
6
Wissen Sie, ob es möglich ist, dies aufzunehmen build.sbt?
Owen
13
Großartige Einsicht. Aber wenn sich dieses Projekt ändert, wie erzwingen Sie sbteine Neukompilierung? cleanscheint nicht zu helfen.
Axel22
2
Hallo Axel22, hast du eine Lösung für dein Problem gefunden?
Jimmy Luong
4
Wie können Sie dies in Situationen konfigurieren, in denen das Git-Repo privat ist? Gibt es eine Möglichkeit, SBT so zu konfigurieren, dass ein Bereitstellungsschlüssel gesendet wird, der in einer Punktdatei oder Umgebungsvariablen festgelegt werden kann?
Acjay
1
Ich möchte auch wissen, wie man sbt-Pull-Änderungen vornimmt, nachdem ich ein neues Commit in das Github-Repository verschoben habe. Wenn ich darauf zeige, neu lade, klone #masteres, dann drücke ich ein neues Commit an den Master und sbt funktioniert weiterhin mit dem ursprünglich geklonten Repository ohne ein neues Commit zu bemerken. An diesem Punkt muss man es entweder löschen /.sbt/0.13/staging/und sbt es erneut klonen lassen oder dorthin gehen und es tungit pull
lisak
99

Sie können ungepackte Abhängigkeiten von GitHub in Ihr Projekt importieren, indem Sie sie mit dem dependsOnOperator als Projektabhängigkeiten behandeln . (Dies unterscheidet sich von der Art und Weise, wie vorkompilierte Bibliotheksabhängigkeiten enthalten sind.)

Beachten Sie, dass Sie mithilfe der #Notation angeben können, welcher Zweig abgerufen werden soll . Hier ist ein Scala SBT-Code, der für mich gut funktioniert:

object V {
  val depProject = "master"
  // Other library versions
}

object Projects {
  lazy val depProject = RootProject(uri("git://github.com/me/dep-project.git#%s".format(V.depProject)))
}

// Library dependencies
lazy val myProject = Project("my-project", file("."))
.settings(myProjectSettings: _*)
.dependsOn(Projects.depProject)
.settings(
  libraryDependencies ++= Seq(...

Beachten Sie, dass es sich lohnt, eine zentrale Einrichtung einzurichten, wenn Sie mehrere SBT-Projekte haben, die von demselben externen Projekt abhängen sbt.boot.directory, um unnötige Neukompilierungen zu vermeiden (siehe Anweisungen hier ).

Alex Dean
quelle
7
Kann sbt das lokale Git auch mit "Git Pull" auf dem neuesten Stand halten? Oder muss ich das manuell machen?
Arne
Ist es möglich "my-project", mithilfe der name := "MyProject"Einstellung aus dem build.sbtProjektstamm dynamisch festzulegen?
Danyel
2
git://Die Protokollsyntax scheint in play / sbt 13.0 für mich nicht zu funktionieren. https://funktioniert aber. Dies kann auch durch eine git-spezifische Einstellung verursacht werden.
Sebastian Graf
Mit sbt 0.13.9 und sbt wird die Git-Abhängigkeit mithilfe eines flachen Klons (Git-Klon - Tiefe 1) korrekt aktualisiert.
Martin Tapp
2
Der Zweig funktioniert nur, wenn gesetzt master, sonst bekomme ich:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Da ich Probleme hatte, die Abhängigkeiten meiner Bibliothek zu lösen (unter Verwendung der vorgeschlagenen RootProject), möchte ich auf das aufgerufene Objekt hinweisen ProjectRef. Wenn man sich also auf eine Bibliothek in Git verlassen muss, schlage ich Folgendes vor:

import sbt.Keys._
import sbt._

object MyBuild extends Build {

  lazy val root = Project("root", file("."))
    .dependsOn(myLibraryinGit)
    .settings(
      ...,
      libraryDependencies ++= Seq(...))

  lazy val myLibraryinGit = ProjectRef(uri("git://[email protected]:user/repo.git#branch"), "repo-name")

}

Quelle: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

Marc Juchli
quelle
1
Im Falle eines Git-Klon-Fehlers versuchen Sie es mit der https uriVersion.
Waldemar Wosiński
6

Ich wollte eine Antwort für sbt 0.13+ hinzufügen. Legen Sie einfach so etwas in Ihren build.sbtStammverzeichnis des Projekts (nicht Build.scala):

lazy val root = (project in file(".")).dependsOn(playJongo)

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))
bekce
quelle