2011-11-30 17 views
12

मान लीजिए मेरी कंपनी में एक व्यक्ति के पास एक एसबीटी परियोजना है जिसे commons कहा जाता है जो कि सामान्य सामान्य उद्देश्य है। इस परियोजना को पारंपरिक एसबीटी तरीके से परिभाषित किया गया है: project/Build.scala फ़ाइल में बिल्ड परिभाषा के साथ मुख्य फ़ोल्डर में।प्रोजेक्ट बनाने के लिए इसे कैसे निर्दिष्ट करें एक अन्य प्रोजेक्ट बी को पहले बनाया जाना है?

अब कोई अन्य व्यक्ति databinding नामक एक प्रोजेक्ट विकसित कर रहा है जो commons पर निर्भर करता है। हम project/Build.scala के साथ इस परियोजना को उसी तरह परिभाषित करना चाहते हैं।

हम निम्नलिखित निर्देशिका लेआउट है

dev/ 
    commons/ 
    src/ 
     *.scala files here... 
    project/ 
     Build.scala 
    databinding/ 
    src/ 
     *.scala files here... 
    project/ 
     Build.scala 

मैं कैसे निर्दिष्ट कर सकते हैं कि databindingcommons की आवश्यकता पहले निर्मित किया जाना है और उत्पादन वर्ग फ़ाइलों का उपयोग करें?

मैं Multi-project builds पढ़ा है, और databinding के निर्माण परिभाषा के लिए निम्नलिखित के साथ आया था:

object MyBuild extends Build { 

    lazy val root = Project(id = "databinding", base = file(".")) settings (
    // ... omitted 
) dependsOn (commons) 

    lazy val common = Project(id = "commons", 
    base = file("../commons") 
) 

} 

यह छोड़कर काम नहीं करता: एसबीटी .. पसंद नहीं करता है और एक AssertionError फेंकता है। जाहिर है, commonsdatabinding के अंदर एक फ़ोल्डर होना चाहिए। लेकिन इन दो परियोजनाओं को अलग गिट भंडारों में रखा जाता है, जिन्हें हम घोंसला नहीं कर सकते हैं।

यह निर्भरता ठीक से कैसे निर्दिष्ट की जा सकती है?

उत्तर

12

आपको रूट प्रोजेक्ट में बहु-प्रोजेक्ट को परिभाषित करने की आवश्यकता है (या जो भी नाम है लेकिन यह एक अच्छा फिट बैठता है) जिसे dev/project/Build.scala में परिभाषित किया जाएगा।

object RootBuild extends Build { 
    lazy val root = Project(id = "root", base = file(".")) 
    .settings(...) 
    .aggregate(commons, databinding) 

    lazy val commons = Project(id = "commons", base = file("commons")) 
    .settings(...) 

    lazy val databinding = Project(id = "databinding", base = file("databinding")) 
    .settings(...) 
    .dependsOn(commons) 
} 

एक और बात, एसबीटी उप-परियोजनाओं में *.scala विन्यास फाइल समर्थन नहीं करता। इसका अर्थ यह है कि आपको commons/project/Build.scala और databinding/project/Build.scala पर क्रमशः commons/build.sbt और databinding/build.sbt पर कॉन्फ़िगरेशन माइग्रेट करना होगा।

यदि आपकी कुछ कॉन्फ़िगरेशन .sbt परिभाषा फ़ाइल के लिए उपयुक्त नहीं हैं, तो आपको उन्हें रूट project/Build.scala रूट में जोड़ना होगा। जाहिर है, रूट Build.scala में परिभाषित सेटिंग्स *.sbt फ़ाइलों में उपलब्ध हैं।

+0

धन्यवाद स्पष्टीकरण, डेविड के लिए बहुत कुछ के लिए नमूना है:

यहाँ RootProject उपयोग करने का एक नमूना है। यह अजीब लगता है, क्या ऐसा इसलिए है क्योंकि अन्य परियोजनाएं मेरे प्रोजेक्ट 'कॉमन्स' का उपयोग करती हैं, इसकी 'scala' फ़ाइल में पूर्ण परिभाषा नहीं हो सकती है? –

+0

और, क्या कोई विकल्प है - उदाहरण के लिए, एक रिज़ॉल्यूशन जोड़ना जो परियोजनाओं द्वारा उत्पन्न जार को देखता है, यह इस पर निर्भर करता है? –

+0

आपके पहले प्रश्न के बारे में, यह एक एसबीटी प्रतिबंध है जो आपको '* का उपयोग करने से रोकता है।उप-परियोजनाओं को परिभाषित करने के लिए स्कैला फ़ाइल। मुझे लगता है कि एसबीटी परियोजना परिभाषा फाइलों को विलय करने के तरीके के कारण यह एक सीमा है। सौभाग्य से, '* .sbt' फ़ाइलें आपकी रूट प्रोजेक्ट 'Build.scala' से vals, सेटिंग्स ... तक पहुंच पाएगी। उदाहरण के लिए स्थानीय (प्रकाशन-स्थानीय) में अपना 'सामान्य' प्रकाशित करने के लिए दूसरी टिप्पणी में आप इसका उल्लेख भी कर सकते हैं और रिज़ॉल्यूवर को इसे पुनर्प्राप्त करना चाहिए। यदि आप एक स्नैपशॉट सिस्टम का उपयोग करना चाहते हैं तो निर्भरता परिभाषा में 'isChanging()' जोड़ने के लिए सावधान रहें। उम्मीद है कि यह मदद करेगा। – David

1

आपके पास दो अलग-अलग परियोजनाएं हो सकती हैं, और केवल स्थानीय रूप से उनमें से एक को प्रकाशित कर सकती हैं, इसे सामान्य लाइब्रेरी निर्भरता के रूप में जोड़ना।

10

आपको RootProject (किसी अन्य प्रोजेक्ट की रूट प्रोजेक्ट के संदर्भ में) या ProjectRef (किसी अन्य प्रोजेक्ट के सबप्रोजेक्ट के संदर्भ में) का उपयोग करना चाहिए।

 lazy val commons = RootProject(file("../commons")) 
     lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons) 

और यहाँ ProjectRef

का उपयोग कर
 lazy val commons = ProjectRef(file("../commons"), "sub-project") 
     lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons) 
+0

क्या यह 'रूटप्रोजेक्ट' नया है? क्या यह नया एपीआई डेविड के अनुशंसित समाधान को अमान्य करता है? –

+0

ऐसा लगता है। नहीं, लेकिन मैं कहूंगा कि यह थोड़ा आसान है –

+1

मैं खुद को समझ नहीं सकता कि अनुमोदित उत्तर ओपी के लिए कैसे काम कर सकता है, जो दो परियोजनाओं के स्वतंत्र होने के उद्देश्य को हरा देता है। रूट परियोजना के कारण वे माइग्रेशन के बाद नहीं होंगे। –

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

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