2016-03-29 7 views
7

Pomagam w projekcie Guardian pod numerem NetCipher. Ze względów starszych chcą zachować dotychczasową strukturę projektu opartą na Eclipse. Jednak zamiast mieć testy w podkatalogu biblioteki tests/, poszły z modelem projektu równorzędnego. Tak więc, z korzenia repo, libnetcipher/ jest biblioteka i netciphertest/ są testy oprzyrządowania.W jaki sposób kierujemy androidTest do projektu Peer Eclipse-Style?

Testy oprzyrządowania nigdy nie zostały ustawione dla wersji Gradle, w przeciwieństwie do samego libnetcipher/. Dodaję więc pliki do pliku libnetcipher/build.gradle, aby wskazywały na jego zestaw źródeł androidTest na katalog netciphertest/, a nie na jego normalne położenie.

to działa:

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'] 
    } 

Jednak zduplikowane ../netciphertest bity są icky. Mogłabym to oczywiście zdefiniować jako stałą, aby zminimalizować duplikację. Próbuję ustalić, czy istnieje lepszy sposób podejścia do całego problemu.

Na przykład, to nie działa:

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'] 
    } 

Myślałam, że być może rzeczy srcDirs i srcFile może być interpretowane w stosunku do wartości setRoot(), ale wydają się być interpretowane w stosunku do własnych korzeni projektu .

Czy istnieje bardziej eleganckie rozwiązanie niż to, które mam?

Odpowiedz

5

czytania w dokumentacji Gradle, nie mogłem znaleźć nic na temat stosunku vs bezwzględnych ścieżek dla srcDirs, ale wydaje się, że jeśli tylko dać src że będzie zakładać ./src niezależnie od korzenia, który został ustawiony. Może to może być prośba o funkcję Gradle lub może działać zgodnie z oczekiwaniami w późniejszych wersjach Gradle? Nie jestem pewien, nie zaglądałem w to.

W takiej sytuacji, przy założeniu, że nie trzeba aidl, renderscripts lub resources (ponieważ nie pojawiają się one wykorzystywane w projekcie), a następnie jest to mniej „icky”?

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

Wszystkie pozostałe zostaną automatycznie ustawione tak, jeśli ich nie zastąpisz i po prostu ustawisz katalog główny.

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] 

Można wydrukować ścieżki w Gradle i bawić się z nim więcej, jeśli chcesz o tym ten odcinek w bloku 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

"Czy to jest mniej" icky "?" - nieco. Szukałem jednak bardziej ogólnej odpowiedzi. Chociaż to pomogłoby w moim konkretnym scenariuszu, wystarczającym do doprowadzenia "niskiego" poziomu do rozsądnych poziomów, miałem nadzieję, że istnieje lepsze rozwiązanie, które nie czyni tych uproszczających założeń. Prawdopodobnie wykonam to czyszczenie, jeśli nie pojawi się żadna inna lepsza opcja. Dzięki! – CommonsWare

+0

Czytałem również o [zastrzyku] (https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:injected_configuration), więc może włożenie pliku build.gradle do folderu 'netciphertest' może działać, "wstrzykiwanie" tego zestawu źródłowego do drugiego modułu. –

+0

@CommonsWare Widziałem, że twoje żądanie ściągnięcia zostało zaakceptowane na Github. Czy znalazłeś lepsze podejście? –