2016-03-29 4 views
7

मैं NetCipher पर गार्जियन प्रोजेक्ट की मदद कर रहा हूं। विरासत के कारणों से, वे अपनी मौजूदा परियोजना संरचना को रखना चाहते हैं, जो ग्रहण पर आधारित था। हालांकि, लाइब्रेरी की tests/ उपनिर्देशिका में परीक्षण करने के बजाय, वे एक सहकर्मी परियोजना मॉडल के साथ गए। तो, रेपो रूट से, libnetcipher/ लाइब्रेरी है और netciphertest/ उपकरण परीक्षण हैं।हम एक पीयर ग्रहण-शैली परियोजना के लिए एंड्रॉइड टेस्ट कैसे करते हैं?

libnetcipher/ के विपरीत, ग्राउंडल बिल्ड के लिए उपकरण परीक्षण कभी स्थापित नहीं किए गए थे। इसलिए, मैं libnetcipher/build.gradle फ़ाइल में सामान जोड़ रहा हूं ताकि यह androidTest स्रोतों को netciphertest/ निर्देशिका में अपने सामान्य स्थान की बजाय इंगित कर सके।

यह काम करता है:

androidTest { 
     manifest.srcFile '../netciphertest/AndroidManifest.xml' 
     java.srcDirs = ['../netciphertest/src'] 
     resources.srcDirs = ['../netciphertest/src'] 
     aidl.srcDirs = ['../netciphertest/src'] 
     renderscript.srcDirs = ['../netciphertest/src'] 
     res.srcDirs = ['../netciphertest/res'] 
     assets.srcDirs = ['../netciphertest/assets'] 
    } 

हालांकि, डुप्लिकेट ../netciphertest बिट्स को भावुक कर रहे हैं। मैं परिभाषित कर सकता हूं कि निश्चित रूप से डुप्लिकेशंस को कम करने के लिए निरंतर के रूप में। मैं यह समझने की कोशिश कर रहा हूं कि पूरी समस्या के लिए बेहतर दृष्टिकोण है या नहीं।

उदाहरण के लिए, इस काम नहीं करता है:

androidTest.setRoot('../netciphertest') 

    androidTest { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     resources.srcDirs = ['src'] 
     aidl.srcDirs = ['src'] 
     renderscript.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     assets.srcDirs = ['assets'] 
    } 

मैंने सोचा कि शायद srcDirs और srcFile सामान setRoot() मूल्य के सापेक्ष व्याख्या की जा सकती है, लेकिन वे परियोजना की ही जड़ के सापेक्ष व्याख्या की जा करने लगते हैं ।

क्या मैं काम कर रहा हूं उससे कहीं अधिक सुरुचिपूर्ण समाधान है?

उत्तर

5

Gradle प्रलेखन से अधिक पढ़ना, मैं के बारे में रिश्तेदार srcDirs के लिए पूर्ण पथ बनाम कुछ भी नहीं मिल सकता है, लेकिन ऐसा लगता है कि यह है कि यह ./src जड़ है कि स्थापित किया गया था की परवाह किए बिना समझेंगे अगर आप सिर्फ src दे। शायद यह एक ग्रैडल फीचर अनुरोध हो सकता है या ग्रैडल के बाद के संस्करणों में अपेक्षित काम कर सकता है? यकीन नहीं है, इसमें नहीं देखा।

इसका अर्थ है कि आप aidl, renderscripts, या resources की जरूरत नहीं है (क्योंकि वे परियोजना में इस्तेमाल प्रदर्शित नहीं होगी) यह सोचते हैं, तो यह कम "को भावुक" क्या है?

androidTest { 
    setRoot '../netciphertest' 
    java.srcDirs = ['../netciphertest/src'] 
} 

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

androidTest.manifest.srcFile = /NetCipher/netciphertest/AndroidManifest.xml 
androidTest.res.srcDirs = [/NetCipher/netciphertest/res] 
androidTest.assets.srcDirs = [/NetCipher/netciphertest/assets] 

// Override these, if you wish 
androidTest.resources.srcDirs = [/NetCipher/netciphertest/resources] 
androidTest.aidl.srcDirs = [/NetCipher/netciphertest/aidl] 
androidTest.renderscript.srcDirs = [/NetCipher/netciphertest/rs] 

आप बाहर Gradle भीतर रास्तों प्रिंट और इसके साथ और अधिक के आसपास खेलते हैं अगर आप sourceSets ब्लॉक के भीतर इस खंड को शामिल करके चाहते कर सकते हैं।

println "androidTest.manifest.srcFile = ${androidTest.manifest.srcFile}" 
println "androidTest.java.srcDirs = ${androidTest.java.srcDirs}" 
println "androidTest.resources.srcDirs = ${androidTest.resources.srcDirs}" 
println "androidTest.aidl.srcDirs = ${androidTest.aidl.srcDirs}" 
println "androidTest.renderscript.srcDirs = ${androidTest.renderscript.srcDirs}" 
println "androidTest.res.srcDirs = ${androidTest.res.srcDirs}" 
println "androidTest.assets.srcDirs = ${androidTest.assets.srcDirs}" 
+0

"तो यह कम" icky "है?" कुछ हद तक हालांकि, मैं एक और अधिक सामान्य उद्देश्य का जवाब मांग रहा था। हालांकि इससे मेरे विशिष्ट परिदृश्य में मदद मिलेगी, "ick" को उचित स्तर तक चलाने के लिए पर्याप्त, मैं उम्मीद कर रहा था कि एक बेहतर समाधान था जिसने उन तरीकों को सरल बनाने के लिए नहीं बनाया। यदि कोई अन्य बेहतर विकल्प नहीं उठता है तो मैं शायद यह सफाई करूंगा। धन्यवाद! – CommonsWare

+0

मैं [इंजेक्शन] (https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:injected_configuration) के बारे में भी पढ़ रहा था, इसलिए शायद 'netciphertest' फ़ोल्डर में build.gradle डालने से काम हो सकता है, फिर उस स्रोत को "इंजेक्शन" अन्य मॉड्यूल में सेट करें। –

+0

@ कॉमन्सवेयर मैंने देखा कि आपका पुल अनुरोध गीथूब पर स्वीकार किया गया था। क्या आप बेहतर दृष्टिकोण ढूंढ रहे हैं? –

संबंधित मुद्दे