2011-09-26 4 views
92

Ho sentito (e so di aver visto anche degli esempi, se solo posso ricordare dove) che sbt può ottenere dipendenze da un repository git.Come possono gli artefatti di derivazione di pull sbt da git?

Sto cercando di ottenere la dipendenza harrah/up da github. Il repository non fornisce file JAR di tipo artefatto, ma solo un albero di sorgenti che è configurato per essere creato utilizzando sbt. Il processo che sto immaginando è che sbt scaricherà il repository di origine, lo costruirà e quindi lo userà come artefatto di dipendenza.

Forse immagino che lo sbt possa effettivamente fare qualcosa del genere. Può esso? E se sì, come?

risposta

73

Sì, certo. È possibile assegnare una dipendenza allo Project con l'operatore dependsOn ed è possibile fare riferimento a un progetto Github tramite l'URI, ad esempio RootProject(uri("git://github.com/dragos/dupcheck.git")). In alternativa, è possibile git clone il progetto e quindi fare riferimento alla copia locale con RootProject(file(...)). Vedi "Full Configuration" sul wiki SBT per dettagli ed esempi.

+6

fai a sapere se è possibile includere questo in 'build.sbt'? – Owen

+0

@Owen, non ne sono sicuro, ma sospetto di no. '' Build.sbt' non ha bisogno di contenere 'Setting's separati da nuova riga? Qualcuno mi corregga se sbaglio. –

+0

Sì; è corretto (anche se non sapevo cosa, quando ho chiesto). Quindi la domanda si riduce a se ci sia un 'Setting' per quello - è possibile che' projectDependencies' sia una tale impostazione; Non ne sono sicuro. – Owen

89

È possibile importare dipendenze non confezionate nel progetto da GitHub trattandole come dipendenze del progetto, utilizzando l'operatore dependsOn. (Questo è distinto dal modo in cui sono incluse le dipendenze delle librerie precompilate).

Si noti che è possibile specificare il ramo da utilizzare utilizzando la notazione #. Ecco alcuni codice Scala SBT che sta lavorando 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(... 

Si noti che se si dispone di più progetti SBT dependending sullo stesso progetto esterno, vale la pena la creazione di un centro sbt.boot.directory per evitare ricompilazioni inutili (vedi instructions here).

+7

può anche tenere aggiornato il git locale con "git pull"? O devo farlo manualmente? – Arne

+0

È possibile impostare '' my-project ''in modo dinamico, usando l'impostazione' name: = "MyProject" 'da' build.sbt' nella root del progetto? – Danyel

+1

'git: //' La sintassi del protocollo non sembra funzionare per me in play/sbt 13.0. 'https: //' funziona comunque. Questo potrebbe anche essere causato da un'impostazione specifica di git. –

7

Poiché ho riscontrato dei problemi nel risolvere le dipendenze della libreria (utilizzando lo RootProject suggerito), vorrei fare riferimento all'oggetto chiamato ProjectRef. Così, se una necessità di dipendere da una libreria residente in git, vi suggerisco di farlo nel modo seguente:

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") 

} 

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

+1

In caso di errore di clone git prova con la versione 'https uri'. –

1

ho voluto aggiungere una risposta per sbt 0.13+. Basta mettere qualcosa di simile al vostro build.sbt sulla cartella di progetto principale (non Build.scala):

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

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