W jaki sposób sbt może pobierać artefakty zależności z gita?

102

Słyszałem (i wiem, że widziałem też przykłady, jeśli tylko pamiętam gdzie), które sbtmogą uzyskać zależności z repozytorium git.

Szukam zależności harrah / up z github. Repozytorium nie udostępnia żadnych plików JAR artefaktów, a jedynie drzewo źródłowe skonfigurowane do budowania przy użyciu sbt. Proces, który sobie wyobrażam, polega na sbtpobraniu repozytorium źródłowego, utworzeniu go, a następnie użyciu go jako artefaktu zależności.

Mogę sobie wyobrazić, że sbtfaktycznie może zrobić coś takiego. Czy to możliwe? A jeśli tak, to w jaki sposób?

piekarnik
źródło

Odpowiedzi:

77

W rzeczy samej. Możesz nadać swoją Projectzależność z dependsOnoperatorem i możesz na przykład odwołać się do projektu Github za pomocą jego identyfikatora URI RootProject(uri("git://github.com/dragos/dupcheck.git")). Alternatywnie możesz git cloneprojekt, a następnie odwołać się do lokalnej kopii za pomocą RootProject(file(...)). Szczegółowe informacje i przykłady można znaleźć w sekcji „Pełna konfiguracja” na wiki SBT.

Kipton Barros
źródło
6
Czy wiesz, czy można to uwzględnić build.sbt?
Owen
13
Świetny wgląd. Ale jeśli ten projekt się zmieni, jak zmusisz go sbtdo ponownej kompilacji? cleannie wydaje się pomagać.
axel22,
2
Cześć Axel22, czy znalazłeś jakieś rozwiązanie swojego problemu?
Jimmy Luong
4
Jak możesz to skonfigurować w sytuacjach, gdy repozytorium git jest prywatne? Czy istnieje sposób skonfigurowania SBT do wysyłania klucza wdrażania, który można ustawić w dotfile lub zmiennej środowiskowej?
acjay
1
Chciałbym również wiedzieć, jak wprowadzić zmiany sbt pull po wypchnięciu nowego zatwierdzenia do repozytorium github, jeśli go #masterwskażę, załaduj ponownie, klonuje, a następnie wypycham nowe zatwierdzenie do mastera i sbt nadal działa z oryginalnie sklonowanym repozytorium bez zauważenia nowego zatwierdzenia. W tym momencie trzeba go albo usunąć /.sbt/0.13/staging/i ponownie sklonować, albo udać się tam i robićgit pull
lisak
99

Możesz zaimportować nieopakowane zależności do projektu z GitHub, traktując je jako zależności projektu przy użyciu dependsOnoperatora. (Różni się to od sposobu, w jaki uwzględniane są zależności bibliotek prekompilowanych).

Zauważ, że możesz określić, która gałąź ma zostać ściągnięta, używając #notacji. Oto kod Scala SBT, który działa dobrze dla mnie:

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

Zwróć uwagę, że jeśli masz wiele projektów SBT zależnych od tego samego projektu zewnętrznego, warto skonfigurować centralny, sbt.boot.directoryaby uniknąć niepotrzebnych ponownych kompilacji (zobacz instrukcje tutaj ).

Alex Dean
źródło
7
czy sbt może również aktualizować lokalny git za pomocą „git pull”? Czy muszę to zrobić ręcznie?
Arne,
Czy można ustawić "my-project"dynamicznie, używając name := "MyProject"ustawienia z build.sbtkatalogu głównego projektu?
Danyel,
2
git://Wydaje się, że składnia protokołu nie działa dla mnie w play / sbt 13.0. https://działa chociaż. Może to być również spowodowane ustawieniem specyficznym dla git.
Sebastian Graf
Użycie sbt 0.13.9 i sbt aktualizuje poprawnie zależność git przy użyciu płytkiego klonu (git clone --depth 1).
Martin Tapp
2
Oddział działa tylko wtedy, gdy jest ustawiony na master, w przeciwnym razie otrzymuję:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Ponieważ miałem problemy z rozwiązaniem zależności mojej biblioteki (przy użyciu sugerowanego RootProject), chciałbym zwrócić uwagę na obiekt o nazwie ProjectRef. Tak więc, jeśli trzeba polegać na bibliotece znajdującej się w git, proponuję zrobić to w następujący sposób:

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

}

Źródło: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

Marc Juchli
źródło
1
W przypadku błędu klonowania git spróbuj z https uriwersją.
Waldemar Wosiński
6

Chciałem dodać odpowiedź dla sbt 0.13+. Po prostu umieść coś takiego build.sbtw folderze głównym projektu (nie Build.scala):

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

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))
bekce
źródło