Comment sbt peut-il extraire des artefacts de dépendance de git?

102

J'ai entendu (et je sais que j'ai vu des exemples aussi, si seulement je peux me souvenir où) qui sbtpeuvent obtenir des dépendances à partir d'un dépôt git.

Je cherche à obtenir la dépendance harrah / up de github. Le référentiel ne fournit aucun fichier JAR d'artefact, uniquement une arborescence source qui est configurée pour être construite à l'aide de sbt. Le processus que j'imagine est de sbttélécharger le référentiel source, de le construire, puis de l'utiliser comme artefact de dépendance.

J'imagine peut-être que cela sbtpeut faire quelque chose comme ça. Peut-il? Et si oui, comment?

Owen
la source

Réponses:

77

Oui en effet. Vous pouvez donner à votre Projectune dépendance avec l' dependsOnopérateur, et vous pouvez référencer un projet Github par son URI, par exemple RootProject(uri("git://github.com/dragos/dupcheck.git")). Vous pouvez également utiliser git clonele projet, puis référencer votre copie locale avec RootProject(file(...)). Voir «Configuration complète» sur le wiki SBT pour des détails et des exemples.

Kipton Barros
la source
6
Savez-vous s'il est possible d'inclure cela build.sbt?
Owen
13
Excellent aperçu. Mais si ce projet change, comment forcez-vous sbtà le recompiler? cleanne semble pas aider.
axel22
2
Bonjour Axel22, avez-vous trouvé une solution à votre problème?
Jimmy Luong
4
Comment pouvez-vous configurer cela dans des situations où le dépôt git est privé? Existe-t-il un moyen de configurer SBT pour envoyer une clé de déploiement, qui pourrait être définie dans un fichier dotfile ou une variable d'environnement?
acjay
1
J'aimerais également savoir comment faire des changements d'extraction de sbt après avoir poussé un nouveau commit dans le référentiel github, si je le pointe #master, le recharger, il le clone, alors je pousse le nouveau commit vers master et sbt fonctionne toujours avec le référentiel cloné à l'origine sans remarquer un nouveau commit. À ce stade, il faut soit le supprimer /.sbt/0.13/staging/et le faire cloner à nouveau par sbt, soit y aller et fairegit pull
lisak le
99

Vous pouvez importer des dépendances non empaquetées dans votre projet à partir de GitHub en les traitant comme des dépendances de projet, à l'aide de l' dependsOnopérateur. (Ceci est différent de la façon dont les dépendances de bibliothèques précompilées sont incluses).

Notez que vous pouvez spécifier la branche à extraire en utilisant la #notation. Voici un code Scala SBT qui fonctionne bien pour moi:

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

Notez que si vous avez plusieurs projets SBT dépendant du même projet externe, cela vaut la peine de configurer une centrale sbt.boot.directorypour éviter les recompilations inutiles (voir les instructions ici ).

Alex Dean
la source
7
sbt peut-il aussi garder le git local à jour avec "git pull"? Ou dois-je le faire manuellement?
Arne
Est-il possible de définir "my-project"dynamiquement, en utilisant le name := "MyProject"paramètre de la build.sbtracine du projet?
Danyel
2
git://la syntaxe du protocole ne semble pas fonctionner pour moi dans play / sbt 13.0. https://fonctionne bien. Cela peut également être causé par un paramètre spécifique à git.
Sebastian Graf
L'utilisation de sbt 0.13.9 et sbt met à jour correctement la dépendance git en utilisant un clone peu profond (git clone --depth 1).
Martin Tapp
2
La branche ne fonctionne que si elle est définie sur master, sinon j'obtiens:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Comme j'ai eu des problèmes pour résoudre les dépendances de ma bibliothèque (en utilisant le suggéré RootProject), j'aimerais signaler l'objet appelé ProjectRef. Ainsi, si l'on a besoin de dépendre d'une bibliothèque résidant dans git, je suggère de le faire comme suit:

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

}

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

Marc Juchli
la source
1
En cas d'erreur de clone git, essayez avec la https uriversion.
Waldemar Wosiński
6

Je voulais ajouter une réponse pour sbt 0.13+. Mettez simplement quelque chose comme ça dans votre build.sbtdossier racine du projet (pas Build.scala):

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

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