2013-01-16 17 views
7

पर हैक करने के लिए एसबीटी पर्यावरण स्थापित करना एसबीटी में लीनिंगेन की "चेकआउट" सुविधा के बराबर है?कई पुस्तकालयों पर एक बार

यहाँ है कि मैं क्या करना चाहते है:

मैं दो परियोजनाओं, एक आवेदन फू और लाइब्रेरी "बार" है। मैं इन परियोजनाओं में से प्रत्येक स्वतंत्र रूप से प्रकाशित करना चाहता हूं। फूबार पर निर्भर करता है, और एसबीटी परियोजना भंडार से "बार" के लिए जार डाउनलोड करने के लिए जब भी एक तीसरी पार्टी "फू" (जो विशिष्ट व्यवहार है) का निर्माण करने की कोशिश करता है एसबीटी निर्देशित करेंगे।

अब, मैं एक ही समय में दोनों फू और बार पर हैक करना चाहते हैं। उदाहरण के लिए, जबकि फूपर काम कर रहा है, मैं सीधे संपादित और डिबग स्रोत के कुछ बार के लिए इतना संपादन फू को प्रभावित करना चाहते हैं (और फिर बाद में पुनर्निर्माण बार जब भी सुविधाजनक हो)।

मैं एसबीटी निर्देश कैसे इस हैक सत्र के दौरान मेरी मशीन पर बार इसके स्रोत कोड से पर अपनी निर्भरता को पूरा करने के (अपने स्थानीय भंडार के बजाय) कर सकते हैं?

(पी एस मैं Clojure/Leiningen के लिए एक similar question पूछा। Leiningen "checkouts" सुविधा है जो पूरा करता है, तो वहाँ एसबीटी में कुछ इसी तरह है। मैं सोच रहा हूँ ... है)

+0

एक टर्मिनल (बीएआर) '' '~ प्रकाशन-स्थानीय''' में।एक और टर्मिनल (खाद्य) '' '~ पुनः लोड में; compile'''। पूरी तरह से untested। –

उत्तर

9

आप फू से एक स्रोत निर्भरता घोषणा कर सकते हैं एक परियोजना संदर्भ के माध्यम से बार करने के लिए:

import sbt._ 

object FooBuild extends Build { 
    lazy val root = Project(
    id = "foo", 
    base = file(".") 
) dependsOn(theBarBuild) 

    lazy val theBarBuild = ProjectRef(
    base = file("/path/to/bar"), 
    id = "bar") 
} 

यह भी बार पुन: संयोजित करना चाहिए (अगर यह बदल गया है) जब भी आप फू संकलन। कृपया ध्यान दें कि प्रोजेक्ट संदर्भ के id को बार प्रोजेक्ट की वास्तविक आईडी से मेल खाना चाहिए, जो कि कुछ ऐसा हो सकता है। default-edd2f8 यदि आप एक साधारण बिल्ड परिभाषा का उपयोग करते हैं (केवल .sbt फाइलें)।

यह तकनीक प्लग-इन के लिए विशेष रूप से उपयोगी है (इस विषय के बारे में मेरे blog post देखें)।

संपादित करें:

आप कर सकते हैं एक तरह से फिर से कोड इस तरह चेकआउट व्यवहार:

import sbt._ 

object FooBuild extends Build { 
    lazy val root = addCheckouts(Project(id = "foo", base = file("."))) 

    def addCheckouts(proj: Project): Project = { 
    val checkouts = proj.base.getCanonicalFile/"checkouts" 
    if (! checkouts.exists) proj 
    else proj.dependsOn(IO.listFiles(DirectoryFilter)(checkouts).map { dir => 
     ProjectRef(base = dir, id = dir.name): ClasspathDep[ProjectReference] 
    }:_*) 
    } 
} 

यह एक checkouts निर्देशिका के लिए अपनी परियोजना निर्देशिका की जाँच करता है, और अगर यह मौजूद है, निर्देशिका कहते हैं उस परियोजना के परियोजना संदर्भ के रूप में (जो अन्य परियोजनाओं के लिए सिम्लिंक होना चाहिए)। यह अपेक्षा करता है कि सिम्लिंक को लिंक किए गए प्रोजेक्ट की वास्तविक आईडी (जैसे default-edd2f8 या bar) की तरह नामित किया जाए। यदि निर्देशिका मौजूद नहीं है, तो बिल्ड बस पहले की तरह काम करता है।

जब आप चेकआउट निर्देशिका (या निर्देशिका स्वयं) में एक सिम्लिंक जोड़ते या हटाते हैं, तो आपको परिवर्तन लेने के लिए Foo प्रोजेक्ट को फिर से लोड करना होगा।

उम्मीद है कि इससे मदद मिलती है।

+5

आप प्रोजेक्ट आईडी निर्दिष्ट किए बिना रूट प्रोजेक्ट चुनने के लिए 'रूटप्रोजेक्ट (डीआईआर)' का भी उपयोग कर सकते हैं। –

+0

धन्यवाद। यह सहायक है। मैने इसे आजमाया और इसने कार्य किया। हालांकि, मैं आदर्श रूप से शामिल परियोजनाओं की सामग्री को बदलने के बिना ऐसा करने में सक्षम होना चाहता हूं। प्लगइन के लिए नौकरी की तरह लगता है? – kes

+0

इसके अलावा, प्रति मार्क हरrah की सलाह के अनुसार, मैंने 'ProjectRef (base = dir, id = dir.name)' को 'रूटप्रोजेक्ट (डीआईआर)' में बदल दिया। बहुत अच्छा काम करता है। – kes

संबंधित मुद्दे