2013-02-06 36 views
10

मैं एक ऐसी स्थिति के लिए एक ग्रैडल मल्टीप्रोजेक्ट बिल्ड तैयार करने की कोशिश कर रहा हूं जिसमें मेरा प्रोजेक्ट लेआउट पहले से ही मेरे लिए निर्धारित है।मौजूदा भंडार लेआउट के लिए ग्रैडल मल्टीप्रोजेक्ट बिल्ड अप करने में कठिनाई होने में

-->Shared\ 
---->SharedComponent1\ 
------>build.gradle 
------>src\ 
... 
---->SharedComponent2\ 
------>build.gradle 
... 
-->Product1\ 
---->ProductComponent1\ 
------>build.gradle 
---->ProductComponent2\ 
------>build.gradle 
... 
---->build\ 
------>settings.gradle 

मेरे settings.gradle इस तरह दिखता है:

rootProject.name = 'Product1' 
rootProject.projectDir = new File("${ProjectsRoot}") 

include 'Shared:SharedComponent1' 
include 'Shared:SharedComponent2' 
include 'Product1:ProductComponent1' 
include 'Product1:ProductComponent2' 

जब मैं इस तरह का निर्माण फ़ोल्डर में Gradle चलाएँ: मैं

gradle -PProjectsRoot=c:\my\project\root\dir projects 

: मैं कुछ इस तरह है

:projects 

------------------------------------------------------------ 
Root project 
------------------------------------------------------------ 

Root project 'build' 
No sub-projects 

To see a list of the tasks of a project, run gradle <project-path>:tasks 
For example, try running gradle :tasks 

BUILD SUCCESSFUL 

यानी इसे पी नहीं मिला rojects मैं बनाने की कोशिश कर रहा हूँ। क्या मैं ग्रैडल के मल्टीप्रोजेक्ट समर्थन के साथ संभव करने की कोशिश कर रहा हूं? या मैं गलत पेड़ को भड़क रहा हूँ?

+0

यहां एक कामकाजी उदाहरण है जो gradle2.2.1 के साथ काम करता है लेकिन एंड्रॉइड स्टूडियो 1.0.2 के साथ नहीं: http://stackoverflow.com/questions/18936433/relative-gradle-project-dependency-with-holoeverywhere/ – k3b

उत्तर

29

संकेत के एक जोड़े:

  • Gradle सख्ती से तार्किक परियोजना पदानुक्रम शारीरिक निर्देशिका लेआउट से (वैसे Gradle परियोजनाओं की एक तार्किक पदानुक्रम में अपने निर्माण का आयोजन करता है) अलग करती है। बस किसी भी मैपिंग के बारे में संभव है। (एक अपवाद जो दिमाग में आता है यह है कि आपके पास एक ही प्रोजेक्ट निर्देशिका साझा करने वाली दो परियोजनाएं नहीं हो सकती हैं।)
  • कस्टम निर्देशिका लेआउट को लागू करने के लिए, आपको केवल रूट प्रोजेक्ट के लिए सभी परियोजनाओं के लिए projectDir सेट करना होगा। आपको सापेक्ष पथ का उपयोग करना चाहिए, उदा। rootProject.projectDir = new File(settingsDir, "../foo") और project(":sub1").projectDir = new File(rootDir, "bar")। यहां, settingsDirsettings.gradle युक्त निर्देशिका को संदर्भित करता है, और rootDirrootProject.projectDir के लिए एक शॉर्टेंड है।
  • सामान्य रूप से परियोजनाओं को कॉन्फ़िगर करने के लिए, आप (root)Project.children पर पुनरावर्ती चल सकते हैं। ध्यान दें कि settings.gradle और build.gradle क्रमशः ProjectDescriptor और Project प्रोजेक्ट का प्रतिनिधित्व करने के लिए विभिन्न प्रकारों का उपयोग करते हैं।
  • ग्रैडल को settings.gradle, या इसके उपनिर्देशिका वाली निर्देशिका से शामिल किया जाना है। प्रयोज्य परिप्रेक्ष्य से, इसलिए निर्देशिका पदानुक्रम की जड़ में settings.gradle डालना सबसे अच्छा है।

अधिक जानकारी के लिए Gradle Build Language Reference में Settings देखते हैं, और Gradle उपयोगकर्ता गाइड में Multi-Project Builds अध्याय।

+0

शानदार, पीटर, धन्यवाद। इसने गलत कामों के पूरे ढेर को हल किया है जो कि मेरे काम के बारे में था। मैं नीचे एक और जवाब पोस्ट करूंगा जो अंतिम उदाहरण दिखा रहा है जो मेरे लिए काम करता है अगर अन्य एक ही क्षेत्र में संघर्ष कर रहे हैं। –

+0

खुशी हुई यह मदद की।सुधार: दस्तावेज़ों के अनुसार, सेटिंग स्क्रिप्ट में -P के साथ एक प्रॉपर्टी सेट भी उपलब्ध है। मैंने तदनुसार अपना जवाब संपादित कर लिया है। –

+0

एक चीज जिसने मुझे बहुत मदद की थी, यह महसूस करना था कि सेटिंग्स। ग्रेडल केवल रूट प्रोजेक्ट में ही रहना चाहिए। – mooreds

11

पूर्णता के लिए, settings.gradle कि ऊपर मेरी विशिष्ट उदाहरण हल इस प्रकार है:

rootProject.name = 'Product1' 

def projectTreeRootDir = new File("${ProjectsRoot}") 

// Shared components 

def sharedRootDir = new File(projectTreeRootDir, 'Shared') 

include ':SharedComponent1' 
project(':SharedComponent1').projectDir = new File(sharedRootDir, 'SharedComponent1') 

include ':SharedComponent2' 
project(':SharedComponent2').projectDir = new File(sharedRootDir, 'SharedComponent2') 

// Product components 

includeFlat 'ProductComponent1', 'ProductComponent2' 

जाहिर है इस उप की बड़ी संख्या के पैमाने पर नहीं है और यह किया जा सकता है काफी बेहतर पीटर द्वारा दिए गए संकेतों का उपयोग करते हुए ऊपर।