Как sbt вывести артефакты зависимостей из git?

Я слышал (и я знаю, что видел примеры, если только я помню, где), что sbt может получать зависимости от репозитория git.

Я ищу, чтобы получить зависимость harrah/up от github. Репозиторий не предоставляет файлы артефактов JAR, а только исходное дерево, которое должно быть создано с помощью sbt. Процесс, который я представляю, заключается в том, что sbt загрузит исходное репо, построит его, а затем использует его как артефакт зависимости.

Я могу представить себе, что sbt может фактически сделать что-то подобное. Может это? И если да, то как?

Ответ 1

Да, действительно. Вы можете указать свою зависимость Project с оператором dependsOn, и вы можете ссылаться на проект Github по его URI, например RootProject(uri("git://github.com/dragos/dupcheck.git")). Кроме того, вы можете git clone проекта, а затем ссылаться на свою локальную копию с помощью RootProject(file(...)). Подробнее см. "Полная настройка" в викторике SBT.

Ответ 2

Вы можете импортировать неупакованные зависимости в свой проект из GitHub, рассматривая их как зависимости проекта, используя оператор dependsOn. (Это отличается от того, как включены предварительно скомпилированные библиотечные зависимости).

Обратите внимание, что вы можете указать, какую ветку вывести, используя нотацию #. Здесь некоторый код Scala SBT, который хорошо работает для меня:

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

Обратите внимание: если у вас есть несколько проектов SBT, зависящих от одного и того же внешнего проекта, стоит создать центральный sbt.boot.directory, чтобы избежать ненужных повторных компиляции (см. инструкции здесь).

Ответ 3

Так как у меня были проблемы с получением зависимостей моей библиотеки (используя предложенный RootProject), я хотел бы указать на объект с именем ProjectRef. Таким образом, если нужно зависеть от библиотеки, находящейся в git, я предлагаю сделать это следующим образом:

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

}

Источник: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

Ответ 4

Я хотел добавить ответ для sbt 0.13+. Просто добавьте что-то вроде этого в build.sbt в корневую папку проекта (не Build.scala):

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

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