Come può sbt estrarre gli artefatti delle dipendenze da git?


102

Ho sentito (e so di aver visto anche esempi, se solo posso ricordare dove) che sbtpossono ottenere dipendenze da un repository git.

Sto cercando di ottenere la dipendenza harrah / up da GitHub. Il repository non fornisce alcun file JAR artefatto, solo un albero di origine che è impostato per essere costruito utilizzando sbt. Il processo che sto immaginando è che sbtscaricherà il repository di origine, lo compilerà e quindi lo utilizzerà come artefatto di dipendenza.

Potrei immaginare che sbtpossa effettivamente fare qualcosa del genere. Può esso? E se sì, come?

Risposte:


77

Si Certamente. Puoi dare la tua Projectdipendenza con l' dependsOnoperatore e puoi fare riferimento a un progetto Github tramite il suo URI, ad esempio RootProject(uri("git://github.com/dragos/dupcheck.git")). In alternativa, puoi git cloneil progetto e quindi fare riferimento alla tua copia locale con RootProject(file(...)). Vedere "Configurazione completa" sul wiki SBT per dettagli ed esempi.


6
Sai se è possibile includerlo build.sbt?
Owen

13
Ottima intuizione. Ma se quel progetto cambia, come costringi sbta ricompilarlo? cleannon sembra aiutare.
axel22

2
Ciao Axel22, hai trovato una soluzione al tuo problema?
Jimmy Luong

4
Come puoi configurarlo in situazioni in cui il repository git è privato? C'è un modo per configurare SBT per inviare una chiave di distribuzione, che potrebbe essere impostata in un dotfile o in una variabile di ambiente?
acjay

1
Mi piacerebbe anche sapere come fare sbt pull modifiche dopo aver inserito un nuovo commit nel repository github, se lo #masterindico, ricarico, lo clona, ​​quindi spingo il nuovo commit su master e sbt funziona ancora con il repository originariamente clonato senza notare un nuovo commit. A questo punto è necessario eliminarlo da /.sbt/0.13/staging/e fare in modo che sbt lo cloni di nuovo o andare lì e faregit pull
lisak

99

Puoi importare dipendenze non pacchettizzate nel tuo progetto da GitHub trattandole come dipendenze del progetto, utilizzando l' dependsOnoperatore. (Questo è diverso dal modo in cui sono incluse le dipendenze della libreria precompilata).

Nota che puoi specificare quale ramo estrarre usando la #notazione. Ecco un po 'di codice Scala SBT che funziona bene per me:

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

Nota che se hai più progetti SBT che dipendono dallo stesso progetto esterno, vale la pena creare una centrale sbt.boot.directoryper evitare ricompilazioni non necessarie (vedi istruzioni qui ).


7
può sbt anche mantenere aggiornato il git locale con "git pull"? O devo farlo manualmente?
Arne

È possibile impostare "my-project"dinamicamente, utilizzando l' name := "MyProject"impostazione dalla build.sbtradice del progetto?
Danyel

2
git://la sintassi del protocollo non sembra funzionare per me in play / sbt 13.0. https://funziona però. Ciò potrebbe anche essere causato da un'impostazione specifica di git.
Sebastian Graf

L'uso di sbt 0.13.9 e sbt aggiorna correttamente la dipendenza git usando un clone superficiale (git clone --depth 1).
Martin Tapp

2
Il ramo funziona solo se impostato su master, altrimenti ottengo:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch'
Neil

9

Dato che ho avuto problemi a risolvere le dipendenze della mia libreria (usando il suggerimento RootProject) vorrei segnalare l'oggetto chiamato ProjectRef. Quindi, se è necessario dipendere da una libreria che risiede in git, suggerisco di farlo come segue:

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://git@github.com:user/repo.git#branch"), "repo-name")

}

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


1
In caso di errore di git clone, prova con la https uriversione.
Waldemar Wosiński

6

Volevo aggiungere una risposta per sbt 0.13+. Basta mettere qualcosa del genere build.sbtnella cartella principale del progetto (non Build.scala):

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

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.