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

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

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

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

4 ответа

Решение

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

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

Поскольку у меня возникли проблемы с получением зависимостей моей библиотеки (с использованием предложенного 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://git@github.com:user/repo.git#branch"), "repo-name")

}

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

Я хотел добавить ответ для 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"))
Другие вопросы по тегам