6

में बहु स्वाद पुस्तकालय के आधार पर एकल स्वाद मॉड्यूल मैं एक बहु स्वाद app पर काम कर रहा हूं। (Gradle नीचे फ़ाइलें)ग्रैडल

यह एक पुस्तकालय tracker है कि एक ही जायके का पालन बुलाया का उपयोग करता internal और external

अब मुश्किल भाग के लिए, feature नामक एक नए मॉड्यूल आते हैं, यह एक कोई स्वाद है, लेकिन यह tracker की जरूरत है निर्भरता के रूप में

app.gradle:

android { 

    buildTypes { 
     debug { 
     } 
     release { 
     } 
    } 

    flavorDimensions "target" 

    productFlavors { 
     internal { 
      dimension "target" 
     } 

     external { 
      dimension "target" 
     } 
    } 
} 

tracker.gradle:

android { 

    publishNonDefault true 

    buildTypes { 
     release { 
     } 
     debug { 
     } 
    } 

    flavorDimensions 'target' 

    productFlavors { 
     internal { 
      dimension "target" 
     } 

     external { 
      dimension "target" 
     } 
    } 
} 

feature.gradle: जब मैं करने के लिए Gradle सिंक कोशिश

android { 
    compileSdkVersion rootProject.ext.compileSdkVersion 

    defaultConfig { 
     compileSdkVersion rootProject.ext.compileSdkVersion 
     buildToolsVersion rootProject.ext.buildToolsVersion 

     defaultConfig { 
      minSdkVersion rootProject.ext.minSdkVersion 
      targetSdkVersion rootProject.ext.targetSdkVersion 
      versionCode 1 
      versionName "1.0" 
      javaCompileOptions { 
       annotationProcessorOptions { 
        includeCompileClasspath false 
       } 
      } 
     } 
    } 

} 

dependencies { 
    implementation(
      [...] 
      project(':tracker') 
    ) 
} 

यहाँ errors हैं:

Unable to resolve dependency for ':[email protected]/compileClasspath': Could not resolve project :tracker. 

Could not resolve project :tracker. 
Required by: 
    project :feature 
> Project :feature declares a dependency from configuration 'implementation' to configuration 'externalRelease' which is not declared in the descriptor for project :tracker. 

Unable to resolve dependency for ':[email protected]/compileClasspath': Could not resolve project :tracker. 

Could not resolve project :tracker. 
[...] 
+1

इस कोशिश : 'ट्रैकर', कॉन्फ़िगरेशन: 'बाहरी रिलीज') ' –

+0

> प्रोजेक्ट: फीचर कॉन्फ़िगरेशन 'कार्यान्वयन' से कॉन्फ़िगरेशन 'बाहरी रिलीज' पर निर्भरता घोषित करता है जिसे प्रोजेक्ट के लिए वर्णक में घोषित नहीं किया गया है टी: ट्रैकर। –

+0

इस ब्लॉग को पढ़ें https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa –

उत्तर

2

अपने प्रश्न से, मुझे क्या मिलता है कि आप लाइब्रेरीको जोड़ने की कोशिश कर रहे हैंआपके feature मॉड्यूल पर निर्भरता के रूप में। अपने में feature.gradle कोशिश निम्नलिखित:

dependencies { 
    implementation project(':tracker') 
} 
Gradle 3.0 के साथ

, वहाँ दो नए कीवर्ड्स implementation और api हैं। compile कीवर्ड बहिष्कृत है। आप डिफ़ॉल्ट रूप से implementation का उपयोग कर सकते हैं। api का उपयोग करें, खासकर जब आपके पास अपनी प्रोजेक्ट (मॉड्यूल -> लिब 1 -> लीब 2) में एक ट्रांजिटिव निर्भरता है, और आपको ग्रैडल को यह बताना होगा कि मॉड्यूल अन्य मॉड्यूल पर उस निर्भरता को पारगमन रूप से निर्यात करना चाहता है, ताकि यह दोनों रनटाइम पर उपलब्ध हो और समय संकलित करें।

अच्छा सचित्र विवरण:

यहाँ implementation और api कीवर्ड के बीच एक अच्छा लेख कह अंतर है: Implementation Vs Api in Android Gradle plugin 3.0

आधिकारिक दस्तावेज़ स्पष्टीकरण:

यहाँ से एक संक्षिप्त विवरण है आधिकारिक दस्तावेज़ीकरण Use the new dependency configurations:

  • कार्यान्वयन:

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

  • API:

    जब एक मॉड्यूल एक API निर्भरता, यह दे रहा है Gradle जानते हैं कि मॉड्यूल संक्रामक अन्य मॉड्यूल है कि निर्भरता निर्यात करना चाहता है, इतना है कि यह उन्हें उपलब्ध है शामिल रनटाइम और संकलन समय दोनों पर। यह कॉन्फ़िगरेशन संकलन की तरह व्यवहार करता है (जिसे अब बहिष्कृत किया गया है), और आपको आमतौर पर इसे केवल लाइब्रेरी मॉड्यूल में उपयोग करना चाहिए। ऐसा इसलिए है क्योंकि, यदि एपीआई निर्भरता अपने बाहरी एपीआई को बदलती है, तो ग्रैडल उन सभी मॉड्यूल को दोबारा जोड़ता है जिनके पास संकलन समय पर उस निर्भरता तक पहुंच होती है। इसलिए, बड़ी संख्या में एपीआई निर्भरता होने से निर्माण के समय में काफी वृद्धि हो सकती है। जब तक आप निर्भरता के एपीआई को एक अलग परीक्षण मॉड्यूल में बेनकाब नहीं करना चाहते हैं, तब तक ऐप मॉड्यूल को कार्यान्वयन निर्भरताओं का उपयोग करना चाहिए।

आशा इस मदद करता है।


अद्यतन

पूर्णता के लिए, ऐसा लगता है वहाँ Gradle 4.1 के साथ साथ एक ज्ञात समस्या है। संस्करण 4.3 का उपयोग करने में मदद करता है। डेमियन के लिए धन्यवाद।

+0

एपीआई में बदल रहा है, यह अब हो रहा है: ': सुविधा के लिए निर्भरता को हल करने में असमर्थ @ डीबग/संकलन क्लासपाथ ': प्रोजेक्ट को हल नहीं कर सका: ट्रैकर। प्रोजेक्ट को हल नहीं कर सका: ट्रैकर। द्वारा आवश्यक: परियोजना: नजर: सुविधा > की परियोजना निम्न कॉन्फ़िगरेशन के बीच चयन नहीं कर सकते - externalDebugApiElements - internalDebugApiElements वे सब के सब से मेल उपभोक्ता विशेषताओं: –

+0

साथ Gradle 4.1 एक ज्ञात समस्या नहीं है, तो आप सही हो जाएगा संस्करण 4.3 –

+0

एह के साथ! समझा। खुशी है कि आप इस मुद्दे को समझने में सक्षम थे। –

1

कोशिश अनुप्रयोग में जोड़ने के लिए बनाने में कामयाब रहे build.gradledefaultConfig ब्लॉक: `कार्यान्वयन परियोजना पथ (:

missingDimensionStrategy "internal"