Làm thế nào để sbt có thể kéo các tạo tác phụ thuộc từ git?


102

Tôi đã nghe (và tôi biết tôi cũng đã xem các ví dụ, giá mà tôi có thể nhớ ở đâu) sbtcó thể lấy các phụ thuộc từ một git repo.

Tôi đang tìm cách lấy harrah / up phụ thuộc từ github. Kho lưu trữ không cung cấp bất kỳ tệp JAR giả nào, chỉ có một cây nguồn được thiết lập để xây dựng bằng cách sử dụng sbt. Quá trình mà tôi đang tưởng tượng là sbtsẽ tải xuống repo nguồn, xây dựng nó, và sau đó sử dụng nó như một tạo tác phụ thuộc.

Tôi có thể đang tưởng tượng rằng sbtthực tế có thể làm điều gì đó như thế này. Nó có thể không? Và nếu vậy, làm thế nào?

Câu trả lời:


77

Đúng vậy. Bạn có thể cung cấp Projectsự phụ thuộc của mình với dependsOntoán tử và bạn có thể tham chiếu một dự án Github bằng URI của nó chẳng hạn RootProject(uri("git://github.com/dragos/dupcheck.git")). Ngoài ra, bạn có thể git clonedự án, và sau đó tham chiếu bản sao cục bộ của bạn với RootProject(file(...)). Xem "Cấu hình đầy đủ" trên SBT wiki để biết chi tiết và ví dụ.


6
Bạn có biết nếu nó có thể bao gồm điều này trong build.sbt?
Owen

13
Cái nhìn sâu sắc. Nhưng nếu dự án đó thay đổi, bạn buộc sbtphải biên dịch lại nó như thế nào? cleandường như không giúp được gì.
axel22

2
Xin chào Axel22, bạn đã tìm thấy giải pháp nào cho vấn đề của mình chưa?
Jimmy Luong

4
Làm thế nào bạn có thể định cấu hình điều này trong các trường hợp git repo là riêng tư? Có cách nào để cấu hình SBT để gửi một khóa triển khai, khóa này có thể được đặt trong một dotfile hoặc biến môi trường không?
acjay

1
Tôi cũng muốn biết cách thực hiện các thay đổi kéo sbt sau khi đẩy cam kết mới vào kho lưu trữ github, nếu tôi trỏ nó đến #master, tải lại, nó sẽ sao chép nó, sau đó tôi đẩy cam kết mới lên master và sbt vẫn hoạt động với kho lưu trữ được sao chép ban đầu mà không nhận thấy một cam kết mới. Tại thời điểm này, người ta phải xóa nó khỏi /.sbt/0.13/staging/và yêu cầu sbt sao chép nó một lần nữa hoặc đến đó và thực hiệngit pull
lisak

99

Bạn có thể nhập các phụ thuộc chưa được đóng gói vào dự án của mình từ GitHub bằng cách coi chúng là các phụ thuộc dự án, sử dụng dependsOntoán tử. (Điều này khác với cách bao gồm các phụ thuộc thư viện được biên dịch trước).

Lưu ý rằng bạn có thể chỉ định nhánh nào sẽ kéo bằng cách sử dụng #ký hiệu. Đây là một số mã Scala SBT đang hoạt động tốt đối với tôi:

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(...

Lưu ý rằng nếu bạn có nhiều dự án SBT phụ thuộc vào cùng một dự án bên ngoài, bạn nên thiết lập một trung tâm sbt.boot.directoryđể tránh biên dịch lại không cần thiết (xem hướng dẫn tại đây ).


7
sbt cũng có thể cập nhật git cục bộ với "git pull" không? Hay tôi cần phải làm điều đó theo cách thủ công?
Arne

Có thể đặt "my-project"động, sử dụng name := "MyProject"cài đặt từ build.sbttrong gốc dự án không?
Danyel

2
git://cú pháp giao thức dường như không hoạt động đối với tôi trong play / sbt 13.0. https://hoạt động mặc dù. Điều này cũng có thể do cài đặt git cụ thể gây ra.
Sebastian Graf

Sử dụng sbt 0.13.9 và sbt cập nhật phụ thuộc git một cách chính xác bằng cách sử dụng một bản sao nông (git clone --depth 1).
Martin Tapp

2
Chi nhánh chỉ hoạt động nếu được đặt thành master, nếu không, tôi nhận được:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch'
Neil

9

Vì tôi đã gặp sự cố khi giải quyết các phần phụ thuộc trong thư viện của mình (bằng cách sử dụng gợi ý RootProject), tôi muốn chỉ ra đối tượng được gọi ProjectRef. Do đó, nếu một người cần phụ thuộc vào một thư viện nằm trong git, tôi khuyên bạn nên làm như sau:

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")

}

Nguồn: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/


1
Trong trường hợp lỗi git clone, hãy thử với https uriphiên bản.
Waldemar Wosiński

6

Tôi muốn thêm câu trả lời cho sbt 0.13+. Chỉ cần đặt một cái gì đó như thế này build.sbtvào thư mục gốc dự án của bạn (không phải Build.scala):

lazy val root = (project in file(".")).dependsOn(playJongo)

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.