2011-09-19 8 views
6

मुझे अपने एंड्रॉइड प्रोजेक्ट को व्यवस्थित करने के लिए सबसे अच्छा तरीका (या सर्वोत्तम अभ्यास) ढूंढने में थोड़ी मदद की ज़रूरत है। सादगी के लिए, मान लें कि एंड्रॉइड के लिए मेरा ग्रहण कार्यक्षेत्र C:\Android\Projects\ है। उस फ़ोल्डर के अंदर मैं पुस्तकालयों से अलग अनुप्रयोगों को पसंद करता हूं और मेरे पास दो अन्य फ़ोल्डर्स हैं, C:\Android\Projects\Applications और C:\Android\Projects\Componentsपुस्तकालयों सहित एंड्रॉइड परियोजनाओं के लिए मुझे स्रोत नियंत्रण कैसे व्यवस्थित करना चाहिए?

एक परियोजना के लिए मैं Components फ़ोल्डर में GitHub से एक पुस्तकालय क्लोन है, मान लें कि C:\Android\Projects\Componentes\SampleLib जाने (है कि फ़ोल्डर के अंदर दो TheLib और TheLibExample फ़ोल्डरों है)। और मेरा ऐप C:\Android\Projects\Applications\MyTestApp में बनाया गया है। फिर मैंने these instructions का पालन करके लाइब्रेरी को ऐप में शामिल किया।

अब मान लें कि मैं अपने ऐप को ओपन-सोर्स समुदाय के साथ साझा करने के लिए गिटहब का उपयोग करना चाहता हूं। मैं एक भंडार तैयार करूंगा और C:\Android\Projects\Applications\MyTestApp से कुछ भंडार में सब कुछ धक्का दूंगा।

यदि कोई मेरा ऐप फोर्क करना चाहता है या मेरी मदद भी करता है, तो उसे पुस्तकालय की आवश्यकता होगी और इसे चलाने के लिए, जो कि मेरे प्रोजेक्ट में शामिल नहीं है। default.properties फ़ाइल में android.library.reference.1=../Components/SampleLib/TheLib की तरह कुछ होगा और किसी को उस लाइब्रेरी को मैन्युअल रूप से क्लोन करने की आवश्यकता होगी और उसे इसे उसी सापेक्ष पथ में रखना होगा, अन्यथा यह मेरे ऐप के लिए स्रोत नियंत्रण को गड़बड़ कर देगा।

एक ही रास्ता मैं इस मुद्दे के हल के लिए सोच सकते हैं इस तरह मेरे कार्यक्षेत्र व्यवस्थित करने के लिए है:

C:\Android\Projects\Applications\MyTestApp\TheApp 
C:\Android\Projects\Applications\MyTestApp\TheLib 
C:\Android\Projects\Componentes\SampleLib 

और मेरे भंडार C:\Android\Projects\Applications\MyTestApp\ से सामग्री के साथ भरा जाना चाहिए।

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

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

+0

आपने बिटबकेट के लिए इस समस्या को कैसे हल किया? बिटबकेट परियोजना में मेरी लाइब्रेरी नहीं जोड़ रहा है – Erum

उत्तर

4

शायद गिट submodules आपकी समस्या का समाधान होगा।

+0

उन लोगों का उपयोग करने के लिए थोड़ा उलझन में। मुझे भविष्य में गहरी खुदाई करनी होगी, क्योंकि अब मैं चीजों को छोड़ रहा हूं जैसे वे हैं। लेकिन मुझे लगता है कि submodules वही है जो मैं देख रहा था :) –

+0

गिट submodules बहुत भ्रमित हैं और मेरी राय में आपके मामले के लिए भी जटिल है। जब मैंने तृतीय पक्ष लाइब्रेरी को शामिल करना चाहते हैं, तो मैंने जो पढ़ा है, उससे सबमिड्यूल की अनुशंसा की जाती है, जिसे आप शायद ही कभी अपडेट करेंगे (केवल तभी होता है जब एक और रिलीज हो)। वे आपकी खुद की लाइब्रेरी के साथ अच्छी तरह से काम नहीं करते हैं, जिसे आप अक्सर अपडेट करेंगे। आप इसके बजाय गिट सबट्री आज़मा सकते हैं: http://apenwarr.ca/log/?m=200904#30 –

1

व्यक्तिगत रूप से मुझे लगता है कि एंड्रॉइड की लाइब्रेरी प्रोजेक्ट एक असफल डिज़ाइन है। यह हास्यास्पद है कि कोड का अन्य भाग संदर्भ/उपयोग करने का एकमात्र तरीका यह है कि एक और संपूर्ण परियोजना प्राप्त करें और आईडीई कॉन्फ़िगरेशन स्तर पर सबकुछ सेट करें। पुस्तकालय क्या है? यह एक पुन: प्रयोज्य घटक होना चाहिए जो एक संग्रह प्रारूप में संकलित और पैक किया गया हो। उनके महत्वपूर्ण नोट Library project storage location के अनुसार, मुझे नहीं लगता कि एक आसान कामकाज है कि हम टाई तोड़ सकते हैं और पुस्तकालय को वास्तविक पुस्तकालय के रूप में प्रबंधित कर सकते हैं। यदि आपकी लाइब्रेरी इतनी एंड्रॉइड नहीं है, तो लिखने/निर्माण करने की कोशिश एक सादा जार लाइब्रेरी के रूप में है और मैवेन लाइब्रेरी बिल्ड/रिलीज और प्रोजेक्ट निर्भरताओं का प्रबंधन करें।

हममम, यह है कि गूगल इसे कहते एंड्रॉयड लाइब्रेरी परियोजना, लाइब्रेरी Android नहीं उचित है।

+0

मैं आपके साथ किसी अन्य प्रोजेक्ट के पूरे सेटअप पर सहमत हूं। विंडोज/सी # से आ रहा है, जहां मैं सिर्फ एक .dll फ़ाइल का संदर्भ दे सकता हूं और अब मैं एंड्रॉइड में कुछ ऐसा नहीं कर सकता। फिर भी, आपका जवाब वास्तव में मेरे प्रश्न का उत्तर नहीं देता है। और पुस्तकालय मेरा नहीं है, यह किसी और का है। मैं ईमानदारी से नहीं जानता कि मैवेन क्या है और इस समय कुछ नया सीखने के लिए परेशान नहीं किया जा सकता है। –

+0

मुझे पता है कि यह कोई जवाब नहीं है, मैं इसे एक टिप्पणी के रूप में जोड़ने की कोशिश कर रहा था लेकिन आकार अतिप्रवाह: पी – yorkw

+1

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

1

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

गिट सबट्री एक बेहतर विकल्प हैं। मुझे a very useful guide मिला जो बताता है कि यह कैसे करें।

मूल रूप से आप अपनी निर्भरता युक्त एक सबफ़ोल्डर बना सकते हैं, और कहा कि सबफ़ोल्डर अंदर क्लोन खजाने:

$ mkdir vendor 
$ git remote add -f ABS https://github.com/JakeWharton/ActionBarSherlock 
$ git merge -s ours --no-commit ABS/master 
$ git read-tree --prefix=vendor/ABS/ -u ABS/master 
$ git commit -m "Merged ABS into vendor/ABS/" 
# Now another lib 
$ git remote add -f Crouton https://github.com/keyboardsurfer/Crouton 
$ git merge -s ours --no-commit Crouton/master 
$ git read-tree --prefix=vendor/Crouton/ -u Crouton/master 
$ git commit -m "Merged Crouton into vendor/Crouton/" 

उसके बाद, आप vendor/ अंदर इस उदाहरण में दो रेपोस/libs होगा; आपको बस उन्हें अपने आईडीई/बिल्ड सिस्टम में जोड़ना होगा।

गिट शाखाकरण और संशोधन submodules के मुकाबले ज्यादा आसान और अधिक सरल हैं।

मैंने a small script भी बनाया है जो इस प्रक्रिया को libs की सूची के लिए स्वचालित करता है।