Bagaimana sbt dapat menarik artefak ketergantungan dari git?

102

Saya pernah mendengar (dan saya tahu saya telah melihat contoh juga, jika saja saya dapat mengingat di mana) yang sbtdapat memperoleh dependensi dari git repo.

Saya mencari untuk mendapatkan ketergantungan harrah / up dari github. Repositori tidak menyediakan file JAR artefak apa pun, hanya pohon sumber yang disiapkan untuk dibangun menggunakan sbt. Proses yang saya bayangkan adalah sbtmengunduh repo sumber, membangunnya, dan kemudian menggunakannya sebagai artefak ketergantungan.

Saya mungkin membayangkan bahwa sbtsebenarnya bisa melakukan sesuatu seperti ini. Bisa kah? Dan jika ya, bagaimana caranya?

Owen
sumber

Jawaban:

77

Ya memang. Anda dapat memberikan Projectdependensi dengan dependsOnoperator, dan Anda dapat mereferensikan project Github dengan URI-nya, misalnya RootProject(uri("git://github.com/dragos/dupcheck.git")). Atau, Anda dapat git clonemengerjakan proyek, dan kemudian mereferensikan salinan lokal Anda dengan RootProject(file(...)). Lihat "Konfigurasi Lengkap" di wiki SBT untuk detail dan contoh.

Kipton Barros
sumber
6
Apakah Anda tahu apakah mungkin untuk memasukkan ini ke dalam build.sbt?
Owen
13
Wawasan luar biasa. Tetapi jika proyek itu berubah, bagaimana Anda memaksa sbtuntuk mengkompilasinya kembali? cleansepertinya tidak membantu.
axel22
2
Hai Axel22, apakah Anda menemukan solusi untuk masalah Anda?
Jimmy Luong
4
Bagaimana Anda dapat mengonfigurasi ini dalam situasi di mana git repo bersifat pribadi? Apakah ada cara untuk mengkonfigurasi SBT untuk mengirim kunci penyebaran, yang dapat diatur dalam variabel dotfile atau lingkungan?
acjay
1
Saya juga ingin tahu bagaimana membuat perubahan sbt pull setelah mendorong komit baru ke repositori github, jika saya mengarahkannya ke #master, memuat ulang, itu mengkloningnya, lalu saya mendorong komit baru ke master dan sbt masih berfungsi dengan repositori yang awalnya dikloning tanpa memperhatikan komit baru. Pada titik ini seseorang harus menghapusnya dari /.sbt/0.13/staging/dan meminta sbt mengkloningnya lagi atau pergi ke sana dan melakukannyagit pull
lisak
99

Anda dapat mengimpor dependensi yang tidak dikemas ke dalam proyek Anda dari GitHub dengan memperlakukannya sebagai dependensi proyek, menggunakan dependsOnoperator. (Ini berbeda dari cara memasukkan dependensi library yang telah dikompilasi).

Perhatikan bahwa Anda dapat menentukan cabang mana yang akan ditarik menggunakan #notasi. Berikut beberapa kode Scala SBT yang berfungsi dengan baik untuk saya:

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

Perhatikan bahwa jika Anda memiliki beberapa proyek SBT yang bergantung pada proyek eksternal yang sama, ada baiknya menyiapkan pusat sbt.boot.directoryuntuk menghindari kompilasi ulang yang tidak perlu (lihat petunjuk di sini ).

Alex Dean
sumber
7
dapatkah sbt juga memperbarui git lokal dengan "git pull"? Atau apakah saya perlu melakukannya secara manual?
Arne
Apakah mungkin untuk menyetel "my-project"secara dinamis, menggunakan name := "MyProject"setelan dari build.sbtdalam akar proyek?
Danyel
2
git://sintaks protokol tampaknya tidak berfungsi untuk saya di play / sbt 13.0. https://bekerja meskipun. Ini mungkin juga disebabkan oleh pengaturan khusus git.
Sebastian Graf
Menggunakan sbt 0.13.9 dan sbt memperbarui dependensi git dengan benar menggunakan klon dangkal (git clone --depth 1).
Martin Tapp
2
Cabang hanya berfungsi jika diatur ke master, jika tidak saya mendapatkan:[error] No project 'project_name' in 'ssh://[email protected]/user/project.git#branch'
Neil
9

Karena saya memiliki masalah dalam menyelesaikan dependensi perpustakaan saya (menggunakan yang disarankan RootProject), saya ingin menunjukkan ke objek yang dipanggil ProjectRef. Jadi, jika seseorang perlu bergantung pada perpustakaan yang berada di git, saya sarankan untuk melakukannya sebagai berikut:

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

}

Sumber: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

Marc Juchli
sumber
1
Jika terjadi kesalahan git clone coba dengan https uriversi.
Waldemar Wosiński
6

Saya ingin menambahkan jawaban untuk sbt 0.13+. Letakkan saja sesuatu seperti ini ke build.sbtfolder root proyek Anda (bukan Build.scala):

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

lazy val playJongo = RootProject(uri("https://github.com/bekce/play-jongo.git"))
bekce
sumber