Как sbt может извлечь артефакты зависимости из git?

93

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

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

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

Теги:
build
sbt

4 ответа

70
Лучший ответ

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

  • 6
    Вы знаете, возможно ли включить это в build.sbt ?
  • 0
    @ Оуэн, я не уверен, но подозреваю, что нет. Разве build.sbt не должен содержать разделенные новой build.sbt Setting s? Кто-то поправит меня, если я ошибаюсь.
Показать ещё 7 комментариев
85

Вы можете импортировать неупакованные зависимости в свой проект из 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, чтобы избежать ненужных повторных компиляции (см. инструкции здесь).

  • 7
    sbt также может обновлять локальный git с помощью "git pull"? Или мне нужно сделать это вручную?
  • 0
    Можно ли динамически установить "my-project" , используя параметр name := "MyProject" из build.sbt в корне проекта?
Показать ещё 4 комментария
7

Так как у меня были проблемы с получением зависимостей моей библиотеки (используя предложенный 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/

  • 1
    В случае ошибки git clone попробуйте использовать версию https uri .
1

Я хотел добавить ответ для 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"))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню