Как 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"))