Sbt git से निर्भरता कलाकृतियों को कैसे खींच सकता है?


102

मैंने सुना है (और मुझे पता है कि मैंने उदाहरण भी देखे हैं, अगर केवल मैं याद कर सकता हूं कि कहां है) जो sbtएक गिट रेपो से निर्भरता प्राप्त कर सकता है।

मैं गितुब से निर्भरता हारा / अप प्राप्त करना चाह रहा हूं । रिपॉजिटरी किसी भी विरूपण साक्ष्य JAR फ़ाइलों को प्रदान नहीं करता है, केवल एक स्रोत का पेड़ है जिसे उपयोग करके बनाया जाना है sbt। जिस प्रक्रिया की मैं कल्पना कर रहा हूं, वह यह हैsbt यह स्रोत रेपो को डाउनलोड करें, उसका निर्माण करें और फिर उस पर निर्भरता विरूपण साक्ष्य के रूप में उपयोग करें।

मैं कल्पना कर सकता हूं कि sbtवास्तव में ऐसा कुछ हो सकता है । यह कर सकते हैं? और यदि हां, तो कैसे?

जवाबों:


77

हाँ सचमुच। आप ऑपरेटर के Projectसाथ अपनी निर्भरता दे सकते हैं dependsOn, और आप उदाहरण के लिए, इसके यूआरआई द्वारा गिथब परियोजना को संदर्भित कर सकते हैं RootProject(uri("git://github.com/dragos/dupcheck.git"))। वैकल्पिक रूप से, आप git cloneप्रोजेक्ट कर सकते हैं , और उसके बाद अपनी स्थानीय प्रति देखें RootProject(file(...))। विवरण और उदाहरणों के लिए SBT विकि पर "पूर्ण कॉन्फ़िगरेशन" देखें ।


6
क्या आप जानते हैं कि क्या इसमें इसे शामिल करना संभव है build.sbt?
ओवेन

13
महान अंतर्दृष्टि। लेकिन अगर वह परियोजना बदल जाती है, तो आप sbtउसे फिर से कैसे लागू करने के लिए मजबूर करते हैं ? cleanमदद करने के लिए प्रतीत नहीं होता है।
axel22

2
हाय Axel22, क्या आपको अपनी समस्या का कोई हल मिला?
जिमी लुओंग

4
आप इसे उन स्थितियों में कैसे कॉन्फ़िगर कर सकते हैं जहां गिट रेपो निजी है? क्या एसबीटी को एक तैनाती कुंजी भेजने के लिए कॉन्फ़िगर करने का एक तरीका है, जिसे डॉटफाइल या पर्यावरण चर में सेट किया जा सकता है?
22

1
मैं यह भी जानना चाहूंगा कि जीआईटीबी रिपॉजिटरी को नए कमिट को पुश करने के बाद sbt पुल परिवर्तन कैसे करें, अगर मैं इसे इंगित करता हूं #master, फिर से लोड करता हूं, तो यह क्लोन करता है, फिर मैं मास्टर के लिए नए कमिट को पुश करता हूं और sbt अभी भी मूल रूप से रिपॉजिटरी के साथ काम करता है। एक नई प्रतिबद्धता के बिना। इस बिंदु पर या तो इसे से हटाना होगा /.sbt/0.13/staging/और इसे फिर से sbt क्लोन करना होगा या वहां जाकर करना होगाgit pull
lisak

99

आप dependsOnऑपरेटर का उपयोग करते हुए, उन्हें प्रोजेक्ट निर्भरता के रूप में मानकर GitHub से अपनी परियोजना में अनपैक्ड निर्भरता आयात कर सकते हैं । (यह उस तरह से अलग है जिसमें पूर्वनिर्धारित पुस्तकालय निर्भरताएं शामिल हैं)।

ध्यान दें कि आप निर्दिष्ट कर सकते हैं कि किस शाखा का उपयोग #संकेतन का उपयोग करने के लिए किया जाए । यहाँ कुछ स्काला एसबीटी कोड है जो मेरे लिए अच्छा काम कर रहा है:

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 को भी अपडेट रख सकता है? या मुझे मैन्युअल रूप से ऐसा करने की आवश्यकता है?
अर्ने

क्या प्रोजेक्ट रूट से सेटिंग "my-project"का उपयोग करके, गतिशील रूप से सेट करना संभव है ? name := "MyProject"build.sbt
डेनियल

2
git://प्रोटोकॉल वाक्यविन्यास मेरे लिए प्ले / sbt 13.0 में काम नहीं करता है। https://हालांकि काम करता है। यह एक विशिष्ट विशिष्ट सेटिंग के कारण भी हो सकता है।
सेबेस्टियन ग्रेफ

Sbt 0.13.9 का उपयोग करना और sbt अपडेट्स को एक उथले क्लोन (git clone --depth 1) का उपयोग करके निर्भरता को सही ढंग से अपडेट करना।
मार्टिन टैप

2
शाखा तभी काम करती है, जब masterमैं सेट हो जाता हूं, अन्यथा मुझे मिलता है:[error] No project 'project_name' in 'ssh://git@github.com/user/project.git#branch'
नील

9

चूँकि मुझे अपनी लाइब्रेरी की निर्भरता को हल करने में समस्याएँ हो रही थीं (सुझाये गये प्रयोग से RootProject) मैं उस ऑब्जेक्ट को इंगित करना चाहूँगा जिसे कहा जाता है ProjectRef। इस प्रकार, यदि किसी को पुस्तकालय में रहने वाले पुस्तकालय पर निर्भर रहने की आवश्यकता है, तो मैं निम्नानुसार ऐसा करने का सुझाव देता हूं:

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-d dependencies-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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.