Android Studio build.gradle में बाहरी प्रोजेक्ट जोड़ते हैं


140

मेरे पास निम्नलिखित सेटअप के साथ एक नमूना परियोजना है:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

जहां ' टेस्ट प्रोजेक्ट ' ' टेस्ट लिब ' पर निर्भर है, और अंतिम ' प्योर जावा लिब ' पर निर्भर करता है।

अब मैं अपने पिछले ग्रहण कार्यक्षेत्र को आयात करने और एंड्रॉइड स्टूडियो के साथ काम करने के बारे में सोच रहा हूं, समस्या यह है कि प्रोजेक्ट सेटअप अलग है, और मैं इसे इस तरह रखना चाहूंगा।

पिछले उदाहरण का उपयोग करने के लिए उदाहरण के लिए:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

मैंने कई विन्यास की कोशिश की है, लेकिन मुझे मूल फ़ोल्डर के दायरे के बाहर एक परियोजना का संदर्भ देने का कोई तरीका नहीं मिला ( उदाहरण में ' रूट ')।

कई प्लेटफार्मों / मॉड्यूल में आप फ़ोल्डर में ऊपर जाने के लिए '..' का उपयोग कर सकते हैं लेकिन यह मेरे लिए काम नहीं करता है, शायद मैंने इसे गलत उपयोग किया है।

क्या किसी को पता है कि ग्रैडल के साथ यह कैसे हासिल किया जा सकता है?

अपडेट करें

मैं और अधिक सामान्य होने की कोशिश करूँगा:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

मैं प्रोजेक्ट A में , प्रोजेक्ट B के मॉड्यूल 1 का उपयोग करना चाहूंगा ।


अद्यतन: 09-03-19

मैंने इसे अभी देखा और मुझे अपडेट करना चाहिए ... लगभग 6 वर्षों के बाद, आज मैं समझदार हूं, और मैं निश्चित रूप से कह सकता हूं कि समस्या "सत्य के स्रोत" की अवधारणा को गलत समझ रही थी।

जबकि लाइब्रेरी में एक रेफरी का कॉन्सेप्ट होना अच्छा है .. और यह "सत्य का स्रोत" जैसा लग सकता है, वास्तविक "सत्य का स्रोत" कोड का संस्करण होगा जो प्रत्येक प्रोजेक्ट उस लाइब्रेरी का उपयोग कर रहा है, कारण पुस्तकालय अपने आप में संस्करण है .. कई संस्करण "सत्य का स्रोत" उस परियोजना के सापेक्ष है जो पुस्तकालय का उपयोग कर रहा है।

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

हालाँकि आपको अपनी सभी परियोजनाओं के लिए अपने सभी पुस्तकालयों के नवीनतम और सबसे बड़े संस्करण का उपयोग करने के लिए लक्ष्य बनाना होगा .. जो अपने आप में एक चुनौती है

इसका कारण पुस्तकालय स्रोतों के साथ एक परियोजना विकसित करने का सही तरीका है कि यह तराजू है ... आप अपने स्वयं के पुस्तकालय विन्यास के साथ प्रत्येक परियोजना के सैकड़ों हो सकते हैं।


4
मुझे लगता है कि इस प्रश्न पर कुछ ध्यान दिया जाता है ... वास्तव में वास्तव में कठिन प्रयास करने के बाद, मैंने अभी के लिए एंड्रॉइड स्टूडियो को छोड़ दिया था, क्योंकि मैं जिस सेटअप का निर्माण करने की कोशिश कर रहा था उसकी जटिलता बहुत अधिक थी, और मेरी अंतिम परियोजना का निर्माण करने योग्य था, लेकिन अत्यधिक अस्थिर है। एंड्रॉइड स्टूडियो के हर लॉन्च के साथ मुझे कुछ मापदंडों को फिर से सेट करना पड़ा, और मैन्युअल रूप से निर्माण का कारण बना। मुझे छोड़ दिए लगभग दो महीने हो चुके हैं, और मुझे उम्मीद है कि चीजें अब बेहतर होंगी!
TacB0sS

दृष्टिकोण 2 यहाँ बताया गया है कि यह बहुत आसानी से कैसे किया जा सकता है: stackoverflow.com/questions/25610727/…
डोरन बेन-एरी

जवाबों:


222

यह मानते हुए कि कुछ अन्य फ़ोल्डर एक ग्रेड प्रोजेक्ट है जिसे आप अपनी सेटिंग में निम्नलिखित की तरह कुछ जोड़ सकते हैं। फ़ाइल फ़ाइल:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
SomeOtherFolder एक प्रोजेक्ट फ़ोल्डर को इंगित करता है और इसमें मॉड्यूल होते हैं, जिन्हें मैं एंड्रॉइड लिब प्रोजेक्ट के मॉड्यूल के रूप में जोड़ना चाहता हूं
TacB0sS

सेटिंग्स 'रूट' की ओर इशारा करती हैं, मुझे किसी अन्य प्रोजेक्ट में किसी अन्य मॉड्यूल के लिए उच्च स्तर प्राप्त करने की आवश्यकता है।
TacB0sS

क्या आप उसके बाद सबमॉडल्स जोड़ सकते हैं? शामिल हैं: someOtherFolder: proj1 '
एथन

1
कुछ विवरणों के साथ अपडेट किया गया। settings.gradle / Project A
Ethan

5
बहुत बढ़िया जवाब। 1.0.2 के रूप में, मुझे निम्न कार्य करने की भी आवश्यकता है: राइट क्लिक मॉड्यूल -> ओपन मॉड्यूल सेटिंग्स -> निर्भरता -> + (नीचे), मॉड्यूल डिपेंडेंसी का चयन करें, सूची से अपनी लाइब्रेरी का चयन करें, ठीक क्लिक करें :)
टी। कॉटलाकिस

49

आपको अपनी फाइल सेटिंग में रखनी होगी। इस लाइनों को अपग्रेड करें:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

फिर आपको अपने builde.gradle (मॉड्यूल: ऐप) को निर्भरता के पेड़, इस लाइन में जोड़ना होगा :

implementation project(':module2')

या प्रोजेक्ट स्ट्रक्चर > ऐप > डिपेंडेंसी में जाएं , ऐड पर क्लिक करें , 3 मॉड्यूल डिपेंडेंसी चुनें और अपना मॉड्यूल चुनें


1
यदि आपको मुख्य ऐप से लाइब्रेरी की कक्षाओं को संदर्भित करने में समस्या है, तो इसका कारण यह है कि लाइब्रेरी संभवतः विभिन्न प्रकारों में आती है। तो, बस एक उचित तरीके से निर्भरता निर्दिष्ट करें compile project(path: ':library', configuration: 'variant'):। यहाँ, variantके होते हैं flavorऔर buildTypeके रूप में पुस्तकालय के द्वारा परिभाषित build.gradleफ़ाइल। उदाहरण के लिए, यदि आप स्वाद releaseमें लाइब्रेरी का प्रकार चाहते हैं develop, तो variantहै developRelease
सेवस्तन सवणुक

9

Gradle 1.10 के साथ (नहीं पता है कि अन्य संस्करणों इस के लिए मान्य होगा) यह है कि क्या मैं यहाँ दिए गए एक जवाब के आधार के साथ आया है http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

मेरे पास एक एपीआई पुस्तकालय परियोजना, एक सामान्य पुस्तकालय परियोजना और मुख्य ऐप परियोजना है। प्रत्येक एक स्टैंड-अलोन विकास परियोजना है और दो पुस्तकालयों को कई ऐप के बीच साझा किया जाना है।

सामान्य प्रोजेक्ट के लिए settings.gradle में:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

फिर मुख्य ऐप प्रोजेक्ट सेटिंग में .ग्रेड:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

संबंधित बिल्ड.gradle फ़ाइलों में से प्रत्येक में आप उन्हें केवल उन नामों से संदर्भित करते हैं जिन्हें आपने उन्हें सेटिंग्स में दिया था। जैसे कि आप किसी अन्य प्रोजेक्ट निर्भरता की तरह हैं।

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

यह काम करने लगता है। यह एपेक्स लाइब्रेरी को परिभाषित करने वाली कई डीईएक्स फाइलों के लिए एक त्रुटि भी नहीं फेंकता है, मुझे संदेह है क्योंकि यह सभी एक ही बिल्ड प्रक्रिया का हिस्सा था और ग्रैडल यह समझ से बाहर करने के लिए पर्याप्त स्मार्ट था।


2
मैं यह कोशिश करता रहता हूं, लेकिन समस्या यह है कि संबंधित पुस्तकालय में निर्भरता कभी भरी हुई नहीं लगती। इसलिए अगर मेरे पास सिर्फ पुस्तकालय खुला है तो यह ठीक लगता है लेकिन जब मैं इसे मुख्य ऐप से आज़माता हूं, तो यह कहता है कि सभी आयातित पुस्तकालय गायब हैं।
19 अप्रेल को Czechnology

@Czechnology में भी यही समस्या थी। उसे हल कर लिया। इस उत्तर के लिए मेरी टिप्पणी देखें: stackoverflow.com/a/29603354/7408927
सेवस्तन सवणुक

9

परियोजना पर राइट क्लिक करें - "ओपन मॉड्यूल सेटिंग्स" चुनें - बाएं फलक में "मॉड्यूल" चुनें - शीर्ष पर "+" प्रतीक पर क्लिक करें - "आयात मॉड्यूल" चुनें।

मॉड्यूल आयात करने के बाद। आपको इसे अपनी वर्तमान परियोजना के लिए एक निर्भरता के रूप में जोड़ना होगा।

"मॉड्यूल" को बाएं फलक में चयनित रखें और अपनी परियोजना पर क्लिक करें - अब निर्भरता टैब पर जाएं और "+" प्रतीक पर क्लिक करें जो नीचे स्थित है - तीसरा विकल्प "मॉड्यूल निर्भरता" चुनें और यदि आपने अपनी परियोजना को सही ढंग से आयात किया है, तो यह होगा आपको सभी उपलब्ध मॉड्यूल दिखाते हैं जिन्हें आपकी वर्तमान परियोजना पर निर्भरता के रूप में जोड़ा जा सकता है।


यह लगभग काम ... परियोजना का निर्माण नहीं किया जा सकता है क्योंकि निर्भरता मॉड्यूल का आउटपुट बिल्ड.ग्रेड फ़ाइल में नहीं जोड़ा गया है, जो वास्तव में मेरा मूल मुद्दा है।
TacB0s

मुझे लगता है कि ग्रेडेल के साथ, आपको सभी परियोजनाओं को एक ही रूट फ़ोल्डर में रखना होगा। उसकी कोशिश करो। जिस प्रोजेक्ट को आप अपने वर्तमान प्रोजेक्ट के समान फ़ोल्डर में निर्भरता के रूप में जोड़ना चाहते हैं, उसे रखें।
वरुंडोयड

यह वही है जो कोई भी नहीं करना चाहता है लेकिन यदि आप एंड्रॉइड स्टूडियो के साथ काम करना चाहते हैं तो एटीएम, यह काम करने का तरीका है। एक और वैकल्पिक तरीका है जिसका मैं अनुसरण कर रहा हूं, मैं इंटेलीज सेटअप में सभी निर्भरता में प्रोजेक्ट बनाता हूं और फिर उस प्रोजेक्ट को एंड्रॉइड स्टूडियो में आयात करता हूं, ऐसा करके मैं एंड्रॉइड स्टूडियो को ग्रैड के बजाय चींटी बिल्ड सिस्टम का उपयोग करने के लिए मजबूर कर रहा हूं। आशा करता हूँ की ये काम करेगा। चीयर्स !!
वरुणोदय

1
@Varundroid, समाधान सबसे पहले Ethan के जवाब का उपयोग करके स्टैंड-अलोन लाइब्रेरी के लिए एक संदर्भ आयात करना है। फिर अपने जवाब का उपयोग करके मॉड्यूल को मुख्य ऐप की निर्भरता में जोड़ें। यह आपको लाइब्रेरी कोड को डुप्लिकेट किए बिना कई ऐप्स में एक ही लाइब्रेरी को संदर्भित करने की अनुमति देता है।
बोर्सो

1

मैं इस सवाल को एक तरह से फिर से पूछता हूं, जो मूल पोस्टरों के इरादों पर जोर देता है कि हम अपने मुख्य एंड्रॉइड प्रोजेक्ट की निर्देशिका के बाहर रहने वाले कस्टम एंड्रॉइड और जावा लाइब्रेरी को कैसे संदर्भित करते हैं?

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


-1

जैसा कि ईथन ने कहा, यदि आप इसे अपनी सेटिंग में शामिल करते हैं। नवीनीकरण, यह एंड्रॉइड स्टूडियो में एक बाहरी परियोजना को जोड़ देगा (इस उदाहरण में, यह मूल फ़ोल्डर में है):

project(':../ProjectB/:module1')

फिर, इसे अपनी किसी एक परियोजना की निर्भरता के रूप में जोड़ने के लिए, बस इसे उस परियोजना के निर्माण में जोड़ें। इस तरह की एक और निर्भरता के रूप में (आप इसे यहाँ की तरह ग्राफिक रूप से भी कर सकते हैं ):

compile project(':../ProjectB/:module1')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.