2011-09-26 17 views
92

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

मैं github से निर्भरता harrah/up प्राप्त करने के लिए देख रहा हूँ। भंडार किसी भी आर्टिफैक्ट जेएआर फाइलों को प्रदान नहीं करता है, केवल एक स्रोत पेड़ जिसे sbt का उपयोग करके बनाया जा सकता है। जिस प्रक्रिया को मैं कल्पना कर रहा हूं वह यह है कि sbt स्रोत रेपो डाउनलोड करेगा, इसे बनाएं, और उसके बाद निर्भरता आर्टिफैक्ट के रूप में उपयोग करें।

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

उत्तर

73

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

+6

क्या आप जानते हैं अगर यह 'build.sbt' में यह शामिल करने के लिए संभव है: बस परियोजना रूट फ़ोल्डर (नहीं Build.scala) पर अपने build.sbt को कुछ इस तरह कर दिया? – Owen

+0

@ ओवेन, मुझे यकीन नहीं है, लेकिन मुझे संदेह नहीं है। क्या 'build.sbt' को' सेटिंग 'से अलग नहीं किया गया है? अगर मैं गलत हूं तो कोई मुझे सही करेगा। –

+0

हां; यह सही है (हालांकि मुझे नहीं पता था कि जब मैंने पूछा था)। इसलिए सवाल यह है कि इसके लिए 'सेटिंग' है या नहीं - यह संभव है कि 'प्रोजेक्ट पर निर्भरता' ऐसी सेटिंग है; मुझे यकीन नहीं है। – Owen

89

dependsOn ऑपरेटर का उपयोग करके, आप परियोजना निर्भरताओं के रूप में उनका इलाज करके गिटहब से अपनी परियोजना में अनपेक्षित निर्भरताओं को आयात कर सकते हैं। (यह इस तरह से अलग है कि precompiled लाइब्रेरी निर्भरताओं को शामिल किया गया है)।

ध्यान दें कि आप # नोटेशन का उपयोग करके खींचने के लिए कौन सी शाखा निर्दिष्ट कर सकते हैं।

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

ध्यान दें कि अगर आप एक ही बाहरी परियोजना पर dependending कई एसबीटी परियोजनाएं हैं, यह एक केंद्रीय sbt.boot.directory की स्थापना अनावश्यक recompilations से बचने के लिए (instructions here देखें) के लायक है: यहाँ कुछ स्काला एसबीटी कोड है कि अच्छी तरह से मेरे लिए काम कर रहा है।

+7

स्थानीय गिट को "गिट पुल" के साथ अद्यतन भी रख सकता है? या मुझे मैन्युअल रूप से ऐसा करने की ज़रूरत है? – Arne

+0

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

+1

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

7

चूंकि मुझे अपनी लाइब्रेरी की निर्भरताओं को हल करने में समस्याएं थीं (सुझाए गए 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://[email protected]:user/repo.git#branch"), "repo-name") 

} 

स्रोत: http://blog.xebia.com/git-subproject-compile-time-dependencies-in-sbt/

+1

गिट क्लोन त्रुटि के मामले में 'https uri' संस्करण के साथ प्रयास करें। –

1

मैं एसबीटी 0.13+ के लिए एक जवाब जोड़ना चाहते थे।

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

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