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

102

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

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

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

Оуэн
источник

Ответы:

77

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

Киптон Баррос
источник
6
Вы знаете, можно ли это включить build.sbt?
Оуэн
13
Отличное понимание. Но если этот проект изменится, как заставить sbtего перекомпилировать? cleanпохоже, не помогает.
axel22
2
Привет, Axel22, вы нашли решение своей проблемы?
Джимми Луонг
4
Как вы можете настроить это в ситуациях, когда репозиторий git является частным? Есть ли способ настроить SBT для отправки ключа развертывания, который можно установить в точечном файле или переменной среды?
acjay 06
1
Я также хотел бы знать, как сделать изменения sbt pull после нажатия новой фиксации в репозиторий github, если я укажу на нее #master, перезагрузите, она клонирует ее, затем я нажимаю новую фиксацию на master, а sbt все еще работает с первоначально клонированным репозиторием не замечая нового коммита. На этом этапе нужно либо удалить его /.sbt/0.13/staging/и заставить sbt клонировать его снова, либо пойти туда и сделатьgit pull
lisak
99

Вы можете импортировать распакованные зависимости в свой проект из 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"? Или мне нужно сделать это вручную?
Arne
Можно ли установить "my-project"динамически, используя name := "MyProject"настройку из build.sbtкорня проекта?
Danyel
2
git://Синтаксис протокола, похоже, не работает для меня в play / sbt 13.0. https://хотя работает. Это также может быть вызвано конкретной настройкой git.
Себастьян Граф,
Использование sbt 0.13.9 и sbt корректно обновляет зависимость git, используя неглубокий клон (git clone --depth 1).
Мартин Тапп,
2
Ветка работает, только если установлено значение master, иначе я получаю:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch'
Нил
9

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

Марк Джучли
источник
1
В случае ошибки git clone попробуйте с https uriверсией.
Waldemar Wosiński
6

Хотел добавить ответ по 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"))
Bekce
источник