2016-03-29 1 views
7

Ich helfe das Guardian Project unter NetCipher aus. Aus alten Gründen möchten sie ihre bestehende Projektstruktur beibehalten, die auf Eclipse basiert. Anstatt jedoch die Tests in einem tests/ Unterverzeichnis der Bibliothek durchzuführen, gingen sie mit einem Peer-Projektmodell. Also, von der Repo-Wurzel, libnetcipher/ ist die Bibliothek und netciphertest/ sind die Instrumentierungstests.Wie weisen wir androidTest auf ein Peer-Eclipse-Projekt hin?

Die Instrumentierung Tests wurden eingestellt nie bis zum Gradle, sich im Gegensatz zu libnetcipher/ baut. Also, ich bin Hinzufügen von Material zu der libnetcipher/build.gradle Datei, um es seine androidTest sourceSet in das Verzeichnis netciphertest/ verweisen, anstatt seine normale Lage.

Dies funktioniert:

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

jedoch die doppelten ../netciphertest Bits Icky sind. Ich könnte das natürlich als Konstante definieren, um die Duplizierung zu minimieren. Ich versuche herauszufinden, ob es eine bessere Lösung für das ganze Problem gibt.

Zum Beispiel funktioniert das nicht:

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

Ich dachte, dass vielleicht die srcDirs und srcFile Zeug zum setRoot() Wert relativ interpretiert werden könnte, aber sie scheinen auf die eigene Wurzel des Projekts interpretiert relativ zu werden .

Gibt es eine elegantere Lösung als das, was ich habe zu arbeiten?

Antwort

5

über die Dokumentation Gradle Lesen, konnte ich nichts über die relative vs absolute Pfade für die srcDirs finden, aber es scheint, dass, wenn Sie nur src geben, die es ./src unabhängig von der Wurzel übernehmen wird, die eingestellt wurde. Vielleicht könnte dies eine Feature-Anfrage für Gradle sein oder könnte in späteren Versionen von Gradle wie erwartet funktionieren. Nicht sicher, habe nicht hineingeschaut.

aber sagen, dass Sie nicht aidl vorausgesetzt brauchen, renderscripts oder resources (da sie im Projekt verwendeten erscheinen nicht), dann ist dieses „eklig“ weniger ist?

Alle anderen werden automatisch wie folgt eingerichtet, wenn Sie sie nicht überschreiben und nur die Wurzel setzen.

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] 

Sie können aus den Pfaden innerhalb Gradle drucken und mit ihm spielen, um mehr, wenn Sie, indem Sie diesen Abschnitt innerhalb des sourceSets Block mögen.

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

"dann ist das weniger" icky "?" - Etwas. Ich suchte jedoch eine allgemeinere Antwort. Während dies meinem spezifischen Szenario helfen würde, genug, um das "ick" auf ein vernünftiges Niveau zu senken, hoffte ich, dass es eine bessere Lösung gab, die solche vereinfachenden Annahmen nicht machte. Ich werde diese Säuberung wahrscheinlich tun, wenn keine andere bessere Option entsteht. Vielen Dank! – CommonsWare

+0

Ich las über [Injektion] (https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:injected_configuration) auch, vielleicht könnte eine build.gradle in den 'netciphertest' Ordner setzen arbeiten, dann "injection" dieses SourceSet in das andere Modul. –

+0

@CommonsWare Ich habe gesehen, dass Ihre Pull-Anfrage auf Github akzeptiert wurde. Hast du am Ende einen besseren Ansatz gefunden? –