Як sbt можна витягти артефакти залежності від git?


102

Я чув (і знаю, що бачив і приклади, якщо тільки я пам'ятаю, де), які sbtможуть отримати залежності від git repo.

Я шукаю отримати 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 repo є приватним? Чи існує спосіб налаштування SBT для надсилання ключа розгортання, який може бути встановлений у дотфайлі чи змінній середовища?
acjay

1
Мені також хотілося б знати, як зробити зміни sbt тягнути після натискання нової фіксації на сховище github, якщо я вказую на це #master, перезавантажую, він клонує, то я натискаю нову команду для master і sbt як і раніше працює з оригінальним клонованим сховищем не помічаючи нового зобов’язання. У цей момент потрібно або видалити його, /.sbt/0.13/staging/і сбт клонувати його знову, або йти туди і робитиgit pull
листок

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"? Або мені це потрібно зробити вручну?
Арне

Чи можливо встановити "my-project"динамічно, використовуючи name := "MyProject"налаштування build.sbtв корені проекту?
Даніель

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-dependitions-in-sbt/


1
У разі помилки клона git спробуйте з https uriверсією.
Вальдемар Восінський

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"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.