SBT और IntelliJ IDEA के साथ कई अन्योन्याश्रित मॉड्यूल कैसे प्रबंधित करें?


82

मैं उनके बीच निर्भरता के साथ कई मॉड्यूल विकसित कर रहा हूं, और उन सभी के साथ एक आईडीईए परियोजना में काम करना चाहता हूं। मैं sbt बिल्ड परिभाषाओं से IDEA प्रोजेक्ट जेनरेट करने के लिए sbt-idea का उपयोग कर रहा हूं , जो व्यक्तिगत प्रोजेक्ट्स के लिए बहुत अच्छा काम करता है। कई-मॉड्यूल मामले में, हालांकि, मैंने अब तक जिन चीजों की कोशिश की है, वे काफी काम नहीं करते हैं:

स्वतंत्र रूप से प्रत्येक मॉड्यूल के लिए एक आईडिया .iml फ़ाइल बनाने के लिए sbt-idea का उपयोग करें ; फिर स्क्रैच से एक मास्टर आईडीईए प्रोजेक्ट बनाएं, इसमें उन मॉड्यूल को जोड़ें। इस मॉड्यूल स्रोतों को एक ही विंडो में सभी संपादन योग्य बनाता है, लेकिन उन्हें बीच निर्भरता ट्रैक नहीं किया जाता है (ताकि भीतर कुछ स्रोत से नेविगेट करने की कोशिश कर foo परियोजना में कुछ करने के लिए बार मेरे आयातित पुस्तकालय संस्करण के लिए ले जाता है बार , न कि स्थानीय स्रोतों )।

Sbt मल्टी-प्रोजेक्ट बिल्ड (उर्फ सबप्रोजेक्ट) का उपयोग करें , जहां पैरेंट प्रोजेक्ट के Build.scala में कुछ चीजें शामिल हैं:

lazy val foo = Project(id = "foo", base = file("foo"))
lazy val bar = Project(id = "bar", base = file("bar")) dependsOn(foo)

यह लगभग काम करता है, उस sbt- विचार में ट्रैक किए गए सबप्रोजेक्ट्स के बीच निर्भरता के साथ एक मास्टर IDEA प्रोजेक्ट उत्पन्न करता है। हालांकि दो कैविएट हैं:

  1. यह एक sbt प्रतिबंध लगता है कि उपप्रोजेक्ट को मास्टर प्रोजेक्ट के उपनिर्देशिका में रहना चाहिए (अर्थात, file("../foo")अनुमति नहीं है)। यह वास्तव में मैं क्या चाहता हूं (क्या होगा अगर एक मॉड्यूल - जैसे कि "बर्तन" या "कॉमन्स" पैकेज - दो अलग-अलग मास्टर प्रोजेक्ट में उपयोग किया जाता है?) लेकिन मैं इसके साथ रह सकता हूं।
  2. मेरे एक उपप्रोजेक्ट का अपना उपप्रोजेक्ट है; मुझे यकीन नहीं है कि sbt खुद इन नेस्टेड प्रोजेक्ट्स के साथ सही तरीके से व्यवहार करता है, लेकिन किसी भी मामले में इन्हें sbt-idea द्वारा अनदेखा किया जाता है। जाहिर है मुझे मास्टर प्रोजेक्ट में पुनरावर्ती रूप से शामिल होने के लिए नेस्टेड सबप्रोजेक्ट चाहिए।

संक्षेप में: मैं उन मॉड्यूल को इकट्ठा करना चाहता हूं जो पहले से ही सुविधाजनक संपादन के लिए ट्रैक निर्भरता वाले एक बड़े IDEA प्रोजेक्ट में सबप्रोजेक्ट कर सकते हैं । मैं यह कैसे कर सकता हूं? धन्यवाद!


2
बाहरी प्रोजेक्ट संदर्भ ( github.com/harrah/xsbt/wiki/Full-Configuration ) के रूप में दूसरों से लिंक करने वाला मेटा-प्रोजेक्ट सेट करने का प्रयास करें । मैंने इसे स्वयं sbt-idea के साथ आज़माया नहीं है, इसलिए यह उत्तर के बजाय टिप्पणी है।
प्रात:

इस विचार के लिए धन्यवाद - लेकिन दुख की बात है कि sbt- विचार पूरी तरह से बाहरी संदर्भों की अनदेखी करता है।
21

शायद यह sbt-idea के अगले संस्करण में मदद करेगा: github.com/mpeltonen/sbt-idea/commit/9f17cc8 github.com/mpeltonen/sbt-idea/commit/4b4adf75
retronym

कूल, इसलिए मैंने उन परिवर्तनों में खींचने के लिए नवीनतम git स्रोतों से svn-idea स्थापित किया, फिर परियोजनाओं को साफ किया और sbt-idea को फिर से चलाया। वहाँ कुछ अजीब निर्भरता संकल्प मुद्दों थे कि मैं पूरी तरह से समझ में नहीं आता है, लेकिन किसी तरह मैं एक काम कर परियोजना के साथ समाप्त हो गया! मुझे उप-परियोजनाओं के लिए आईडीए में स्रोत डायरियों को मैन्युअल रूप से सेट करना पड़ा; और पूर्वव्यापी में मुझे यकीन नहीं है कि मैं स्टॉक sbt-idea 11.1 के साथ पहली बार में ऐसा नहीं कर सकता था। किसी भी तरह, धन्यवाद - मुझे लगता है कि मैं अब इस याक को शेविंग करना बंद कर सकता हूं।
डेविड सोर्जेल

उस अंतिम टिप्पणी को लिखने के बाद मैंने पाया कि मेरे पास काम करने की परियोजना नहीं थी (फिर, उप-परियोजनाओं के साथ परेशानी)। इसलिए मैंने अभी उन्हें प्रथम श्रेणी की परियोजनाओं में विभाजित किया है, इसलिए मेरे मास्टर प्रोजेक्ट में अब इसके नीचे केवल एक स्तर के उपप्रोजेक्ट हैं। बेशक, मैं केवल यही कर सकता था क्योंकि यह मेरा अपना कोड है जिसकी शुरुआत करनी है।
डेविड सोर्जेल

जवाबों:


7

मल्टी-प्रोजेक्ट बिल्ड के साथ दृष्टिकोण सही है। आपके पास मनमाने ढंग से लंबाई के उपप्रोजेक्ट का एक नेस्टेड पेड़ हो सकता है, लेकिन आपके पास कई मूल परियोजनाओं से संबंधित मॉड्यूल नहीं हो सकता है। यह बिल्कुल समझ में आता है, और मावेन में भी ऐसा ही होता है।

कारण यह है कि एक ही मॉड्यूल को कई परियोजनाओं में रखना मुश्किल होगा और स्रोतों को सिंक्रनाइज़ रखना होगा। एक सामान्य वर्कफ़्लो निम्नलिखित है:

  • आपके पास एक परियोजना है जो मॉड्यूल से संबंधित है, जहां आप मॉड्यूल स्रोत को संशोधित करते हैं।
  • आप मॉड्यूल को अपने स्थानीय भंडार में प्रकाशित करते हैं
  • अन्य परियोजनाओं में जहां आपको मॉड्यूल की आवश्यकता होती है, आप इसे एक पुस्तकालय पर निर्भरता के रूप में घोषित करते हैं

यदि आप एक ऐसे मॉड्यूल को लोड करना चाहते हैं जो आइडिया के अंदर वर्तमान परियोजना से संबंधित नहीं है, तो यह संभव है, क्योंकि आप इसे बाहरी मॉड्यूल के रूप में कार्यक्षेत्र में जोड़ सकते हैं:

  • SBT-IDEA आपके प्रोजेक्ट के लिए .iml फ़ाइलें बनाता है और आप उन्हें कार्यक्षेत्र में आयात करते हैं
  • आप कार्यक्षेत्र में अन्य प्रोजेक्ट्स के अन्य जोड़ सकते हैं
  • यदि आप बाहरी एसबीटी मॉड्यूल को संशोधित करते हैं जो आपने मैन्युअल रूप से कार्यक्षेत्र में जोड़ा है, तो आपको "मुख्य" परियोजना पर परिवर्तनशील प्राप्त करने के लिए उन्हें पुनः प्रकाशित करना चाहिए, जो उन बाहरी मॉड्यूल को "लाइब्रेरीडिपेंडेंसी" देखता है

इनपुट के लिए धन्यवाद। हालांकि समस्या यह है कि यह मामला नहीं है कि "आपके पास मनमाने ढंग से लंबाई के उपप्रकार के एक नेस्टेड पेड़ हो सकते हैं"। मैं इस बात से सहमत हूं कि इसे sbt के साथ काम करना चाहिए, लेकिन sbt-idea में स्पष्ट रूप से परिणामी IDEA फ़ाइल में उप-उप-परियोजनाएँ शामिल नहीं हैं।
डेविड सोर्जेल

क्या यह सीमा विचार से आती है?
एडमंडो १

नहींं, मैंने निश्चित रूप से IDEA प्रोजेक्ट पदानुक्रम को कई स्तरों पर गहरा बनाया है।
डेविड सोर्जेल

7

यह एक sbt प्रतिबंध लगता है कि उपप्रोजेक्ट को मास्टर प्रोजेक्ट की उपनिर्देशिकाओं में रहना चाहिए (यानी, फ़ाइल ("../ फू") की अनुमति नहीं है)। यह वास्तव में नहीं है कि मैं क्या चाहता हूं (क्या होगा यदि एक मॉड्यूल - जैसे "बर्तन" या "कॉमन्स" पैकेज - दो अलग-अलग मास्टर प्रोजेक्ट में उपयोग किया जाता है?) लेकिन मैं इसके साथ रह सकता हूं।

13.5 sbt और intellij 13.x के साथ, आप Build.scala का उपयोग करके, सापेक्ष पथ के साथ अंतर-परियोजना निर्भरता निर्दिष्ट कर सकते हैं । मान लें कि आपके पास दो प्रोजेक्ट हैं, एक कोर प्रोजेक्ट कॉमन्स और दूसरा प्रोजेक्ट फू , दोनों एक कॉमन डायरेक्टरी कोड में रहते हैं /

  1. कोड / फू / प्रोजेक्ट / के तहत Build.scala बनाएँ
  2. इस कोड को स्निपेट insde Build.scala में डालें

    object ProjectDependencies {
        val commons = RootProject(file("../commons"))
    }
    
    object ProjectBuild extends Build {
        import ProjectDependencies._
    
        lazy val root = Project(id = "foo", base = file(".")).dependsOn(commons)
    }
    
  3. अपने इंटेलीज प्रोजेक्ट को sbt द्वारा जनरेट करें sbt gen-idea


क्या यह "फू" से जोड़कर "कॉमन्स" स्रोत के संपादन की अनुमति देगा?
Tjunkie

हाँ, यह अनुमति देता है। और यह मेरे sbt पर काम करता है 0.13.7 और intellij 14.0.3 किश्त
user2829759
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.