¿Cómo puede sbt extraer artefactos de dependencia de git?

102

He escuchado (y sé que también he visto ejemplos, si tan solo pudiera recordar dónde) que sbtpueden obtener dependencias de un repositorio de git.

Estoy buscando obtener la dependencia harrah / up de github. El repositorio no proporciona ningún archivo JAR de artefactos, solo un árbol de origen que está configurado para ser construido usando sbt. El proceso que estoy imaginando es que sbtdescargará el repositorio de origen, lo compilará y luego lo usará como artefacto de dependencia.

Puedo estar imaginando que sbtde hecho se puede hacer algo como esto. ¿Puede? Y si es así, ¿cómo?

Owen
fuente

Respuestas:

77

Sí, claro. Puede darle Projectuna dependencia con el dependsOnoperador y puede hacer referencia a un proyecto de Github por su URI, por ejemplo RootProject(uri("git://github.com/dragos/dupcheck.git")). Alternativamente, puede git cloneel proyecto y luego hacer referencia a su copia local con RootProject(file(...)). Consulte "Configuración completa" en la wiki de SBT para obtener detalles y ejemplos.

Kipton Barros
fuente
6
¿Sabes si es posible incluir esto build.sbt?
Owen
13
Gran conocimiento. Pero si ese proyecto cambia, ¿cómo se obliga sbta volver a compilarlo? cleanno parece ayudar.
axel22
2
Hola Axel22, ¿encontraste alguna solución a tu problema?
Jimmy Luong
4
¿Cómo se puede configurar esto en situaciones en las que el repositorio de git es privado? ¿Hay alguna forma de configurar SBT para enviar una clave de implementación, que podría establecerse en un archivo de puntos o una variable de entorno?
acjay
1
También me gustaría saber cómo hacer cambios de extracción de sbt después de enviar una nueva confirmación al repositorio de github, si lo apunto, lo recargo #master, lo clona, ​​luego presiono una nueva confirmación para master y sbt todavía funciona con el repositorio clonado originalmente sin notar un nuevo compromiso. En este punto, uno tiene que eliminarlo /.sbt/0.13/staging/y hacer que sbt lo clone nuevamente o ir allí y hacerlogit pull
lisak
99

Puede importar dependencias no empaquetadas en su proyecto desde GitHub tratándolas como dependencias del proyecto, usando el dependsOnoperador. (Esto es distinto de la forma en que se incluyen las dependencias de bibliotecas precompiladas).

Tenga en cuenta que puede especificar qué rama extraer mediante #notación. Aquí hay un código de Scala SBT que me está funcionando bien:

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

Tenga en cuenta que si tiene varios proyectos SBT que dependen del mismo proyecto externo, vale la pena configurar una central sbt.boot.directorypara evitar recompilaciones innecesarias (consulte las instrucciones aquí ).

Alex Dean
fuente
7
¿Puede sbt también mantener actualizado el git local con "git pull"? ¿O tengo que hacerlo manualmente?
Arne
¿Es posible establecer "my-project"dinámicamente, usando la name := "MyProject"configuración de build.sbten la raíz del proyecto?
Danyel
2
git://la sintaxis del protocolo no parece funcionar para mí en play / sbt 13.0. https://aunque funciona. Esto también puede deberse a una configuración específica de git.
Sebastian Graf
El uso de sbt 0.13.9 y sbt actualiza la dependencia de git correctamente usando un clon superficial (git clone --depth 1).
Martin Tapp
2
La rama solo funciona si se establece en master, de lo contrario obtengo:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Como tuve problemas para resolver las dependencias de mi biblioteca (usando lo sugerido RootProject), me gustaría señalar el objeto llamado ProjectRef. Por lo tanto, si uno necesita depender de una biblioteca que reside en git, sugiero que lo haga de la siguiente manera:

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

}

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

Marc Juchli
fuente
1
En caso de error de clonación de git, intente con la https uriversión.
Waldemar Wosiński
6

Quería agregar una respuesta para sbt 0.13+. Simplemente coloque algo como esto build.sbten la carpeta raíz del proyecto (no Build.scala):

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

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