sbt สามารถดึงสิ่งประดิษฐ์การพึ่งพาจาก git ได้อย่างไร


102

ฉันเคยได้ยิน (และฉันรู้ว่าฉันเคยเห็นตัวอย่างด้วยเช่นกันถ้าฉันจำได้แค่ไหน) ที่sbtสามารถรับการอ้างอิงจาก git repo

ฉันต้องการได้รับharrah / upจาก github พื้นที่เก็บข้อมูลไม่ได้ให้ไฟล์ JAR สิ่งประดิษฐ์ใด ๆ sbtเพียงแหล่งต้นไม้ที่มีการตั้งค่าที่จะสร้างขึ้นโดยใช้ กระบวนการที่ฉันจินตนาการคือsbtจะดาวน์โหลดแหล่งที่มา repo สร้างขึ้นจากนั้นใช้สิ่งนั้นเป็นสิ่งประดิษฐ์การพึ่งพา

ฉันอาจจินตนาการว่าที่sbtจริงแล้วสามารถทำอะไรแบบนี้ได้ ได้หรือไม่? และถ้าเป็นเช่นนั้นอย่างไร?

คำตอบ:


77

ใช่แน่นอน. คุณสามารถให้คุณProjectพึ่งพากับdependsOnผู้ประกอบการและคุณสามารถอ้างอิงโครงการ Github โดย URI RootProject(uri("git://github.com/dragos/dupcheck.git"))ของตนตัวอย่างเช่น หรือคุณสามารถโครงการแล้วอ้างอิงสำเนาของคุณด้วยgit clone RootProject(file(...))ดู"การกำหนดค่าแบบเต็ม"ในวิกิ SBT สำหรับรายละเอียดและตัวอย่าง


7
คุณรู้หรือไม่ว่าเป็นไปได้ที่จะรวมสิ่งนี้ไว้ในbuild.sbt?
Owen

13
ความเข้าใจที่ดี แต่ถ้าโครงการนั้นเปลี่ยนไปคุณsbtจะบังคับให้คอมไพล์ใหม่ได้อย่างไร? cleanดูเหมือนจะไม่ช่วยอะไร
axel22

2
สวัสดี Axel22 คุณพบวิธีแก้ปัญหาของคุณหรือไม่?
Jimmy Luong

4
คุณจะกำหนดค่าสิ่งนี้ในสถานการณ์ที่ git repo เป็นแบบส่วนตัวได้อย่างไร มีวิธีกำหนดค่า SBT เพื่อส่งคีย์การปรับใช้ซึ่งสามารถตั้งค่าในตัวแปร dotfile หรือสภาพแวดล้อมได้หรือไม่
acjay

1
ฉันต้องการทราบวิธีทำการเปลี่ยนแปลง sbt pull หลังจากที่ผลักดันการกระทำใหม่ไปยังที่เก็บ github ถ้าฉันชี้ไปที่#masterโหลดใหม่มันจะโคลนมันจากนั้นฉันจะส่งการกระทำใหม่ไปยัง master และ sbt ยังคงใช้งานได้กับที่เก็บโคลนเดิม โดยไม่สังเกตเห็นการกระทำใหม่ เมื่อมาถึงจุดนี้เราต้องลบออก/.sbt/0.13/staging/และทำการโคลน sbt อีกครั้งหรือไปที่นั่นและทำgit pull
lisak

100

คุณสามารถนำเข้าการอ้างอิงที่ไม่รวมแพ็กเกจไปยังโปรเจ็กต์ของคุณจาก 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://ใช้งานได้แม้ว่า นอกจากนี้ยังอาจเกิดจากการตั้งค่าเฉพาะคอมไพล์
Sebastian Graf

การใช้ sbt 0.13.9 และ sbt จะอัปเดตการพึ่งพา git อย่างถูกต้องโดยใช้โคลนตื้น (git clone --depth 1)
Martin Tapp

2
สาขาใช้งานได้เฉพาะเมื่อตั้งค่าเป็นmasterมิฉะนั้นฉันจะได้รับ:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch'
Neil

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"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.