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

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

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

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


person Owen    schedule 26.09.2011    source источник


Ответы (4)


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

person Kipton Barros    schedule 26.09.2011
comment
Вы знаете, можно ли включить это в build.sbt? - person Owen; 02.10.2011
comment
@ Оуэн, я не уверен, но подозреваю, что нет. Разве build.sbt не обязательно содержать Setting, разделенные новой строкой? Кто-нибудь поправит меня, если я ошибаюсь. - person Kipton Barros; 04.10.2011
comment
Да; это правильно (хотя я не знал что, когда я спросил). Таким образом, вопрос сводится к тому, существует ли Setting для этого - возможно, что projectDependencies является такой настройкой; Я не уверен. - person Owen; 04.10.2011
comment
Для этого вам понадобится сборка .scala. - person retronym; 27.02.2012
comment
Отличное понимание. Но если этот проект изменится, как вы заставите sbt его перекомпилировать? clean, похоже, не помогает. - person axel22; 22.09.2012
comment
Привет, Axel22, вы нашли решение своей проблемы? - person Jimmy Luong; 22.04.2014
comment
Как вы можете настроить это в ситуациях, когда репозиторий git является частным? Есть ли способ настроить SBT для отправки ключа развертывания, который может быть установлен в точечном файле или переменной среды? - person acjay; 07.01.2016
comment
Я также хотел бы знать, как сделать изменения sbt pull после нажатия нового коммита в репозиторий github, если я укажу его на #master, перезагрузите, он его клонирует, затем я нажимаю новый коммит в master, а sbt по-прежнему работает с изначально клонированным репозиторий, не замечая нового коммита. На этом этапе нужно либо удалить его из /.sbt/0.13/staging/ и снова клонировать sbt, либо пойти туда и сделать git pull - person lisak; 02.09.2017

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

person Alex Dean    schedule 12.01.2012
comment
Может ли sbt также обновлять локальный git с помощью git pull? Или мне нужно сделать это вручную? - person Arne; 12.07.2013
comment
Можно ли установить "my-project" динамически, используя параметр name := "MyProject" из build.sbt в корне проекта? - person Danyel; 25.12.2013
comment
git:// синтаксис протокола у меня не работает в play / sbt 13.0. https:// хотя работает. Это также может быть вызвано настройкой git. - person Sebastian Graf; 11.01.2014
comment
Использование sbt 0.13.9 и sbt правильно обновляет зависимость git, используя неглубокий клон (git clone --depth 1). - person Martin Tapp; 28.10.2015
comment
Ветка работает, только если установлено значение master, в противном случае я получаю: [error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch' - person Neil; 12.05.2016
comment
@Neil вы указали подпроект как project_name в своем проекте верхнего уровня, но в подпроекте build.sbt вы, вероятно, ссылались на него как на что-то другое. Имя val определяет имя проекта. - person John Smith; 17.01.2018

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

person Marc Juchli    schedule 17.09.2015
comment
В случае ошибки git clone попробуйте использовать версию https uri. - person Waldemar Wosiński; 26.01.2017

Хотел добавить ответ по 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"))
person bekce    schedule 15.12.2017