2016-03-29 14 views
7

Sto aiutando il progetto Guardian su NetCipher. Per ragioni ereditate, vogliono mantenere la struttura del progetto esistente, basata su Eclipse. Tuttavia, anziché avere i test in una sottodirectory tests/ della libreria, sono andati con un modello di progetto peer. Quindi, al di fuori della radice del protocollo, libnetcipher/ è la libreria e netciphertest/ sono i test di strumentazione.Come si punta AndroidTest a un progetto Peer Eclipse-Style?

I test di strumentazione non sono mai stati impostati per build Gradle, a differenza dello stesso libnetcipher/. Quindi, sto aggiungendo cose al file libnetcipher/build.gradle per fare in modo che punti il ​​suo sourceet androidTest nella directory netciphertest/, piuttosto che nella sua posizione normale.

Questo funziona:

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

Tuttavia, il duplicato ../netciphertest bit sono icky. Potrei definirlo come una costante per minimizzare la duplicazione, ovviamente. Sto cercando di capire se c'è un approccio migliore all'intero problema.

Ad esempio, questa non funziona:

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

ho pensato che forse la roba srcDirs e srcFile potrebbe essere interpretato in relazione al valore setRoot(), ma sembrano essere interpretato relativo alla propria radice del progetto .

C'è una soluzione più elegante di quella che ho lavorato?

risposta

5

Rileggendo la documentazione Gradle, non ho trovato nulla di relativo vs percorsi assoluti per la srcDirs, ma sembra che se si dà src che assumerà ./src indipendentemente dalla radice che è stata impostata. Forse questa potrebbe essere una richiesta di funzionalità Gradle o potrebbe funzionare come previsto nelle versioni successive di Gradle? Non sono sicuro, non l'ho guardato.

Detto questo, a patto che non ha bisogno aidl, renderscripts, o resources (dal momento che non appaiono utilizzati nel progetto), allora è questo meno "icky"?

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

Tutti gli altri verranno automaticamente impostati in questo modo se non si esegue l'override e si imposta semplicemente la radice.

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] 

È possibile stampare i percorsi all'interno Gradle e giocare con più se ti piace includendo questa sezione all'interno del blocco 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

"allora questo è meno" icky "?" - un po '. Stavo cercando una risposta più generale, però. Mentre ciò avrebbe aiutato il mio scenario specifico, abbastanza da portare lo "stallo" a livelli ragionevoli, speravo che ci fosse una soluzione migliore che non rendesse questo tipo di ipotesi semplificative. Probabilmente effettuerò questa pulizia se non emergerà un'altra opzione migliore. Grazie! – CommonsWare

+0

Stavo leggendo su [injection] (https://docs.gradle.org/current/userguide/organizing_build_logic.html#sec:injected_configuration), quindi forse mettere un build.gradle nella cartella 'netciphertest' potrebbe funzionare, quindi "iniettare" quel sourceSet nell'altro modulo. –

+0

@CommonsWare Ho visto che la tua richiesta pull è stata accettata su Github. Hai finito per trovare un approccio migliore? –