28

Ho un progetto Android multi-condorato, multi-build-typed e voglio integrare il plugin NewRelic. Ma devo applicarlo solo per uno dei clienti, quindi solo per un gusto del prodotto.
NewRelic utilizza la strumentazione e il plug-in genererebbe il codice in altri sapori se ho applicato il plug-in lì e ciò non è consentito per noi.Come applicare il plugin a un solo aroma in gradle?

Quindi la mia domanda è: come posso utilizzare il comando apply plugin: something nel file gradle per essere applicato a uno solo dei miei aromi?

risposta

4

Ho trovato una soluzione, ma non è la migliore finora. Quindi non ne sono più sicuro, quello che volevo fare inizialmente è possibile. La valutazione del file gradle e la scelta del giusto sapore e tipo di build si trovano in diverse fasi della build del gradle, quindi quello che ho fatto è:

Uso un parametro di build dalla riga di comando. Quando quel paramerer è vero, applico il plugin, quando non è nemmeno lì, lo applico anche (per build IDE). Io uso Jenkins, quindi potrei scrivere quel parametro nel lavoro di costruzione.

file di build.gradle:

// First we have to attach a task to the project, which will be running first 
gradle.projectsEvaluated { 
    preBuild.dependsOn(applyNewRelicByProperty) 
} 

// Then check on the parameter, which comes from the command line 
task applyNewRelicByProperty { 
    if(!project.hasProperty('compileNewRelic')) { 
     // NewRelic on: 'compileNewRelic' property not set, so running from IDE. 
     apply plugin: 'newrelic' 
    } else if(project.hasProperty('compileNewRelic') && project.getProperties().get('compileNewRelic').equals('true')) { 
     // NewRelic on: 'compileNewRelic' property is set and it is 'true'. 
     apply plugin: 'newrelic' 
    } else { 
     // NewRelic off 
     println("No NewRelic") 
    } 
} 

E si deve eseguire la compilazione Gradle da questo:

assembleYourApp -PcompileNewRelic=true 
+0

Questo non funziona per me come di oggi. Apparentemente, il parser 'build.gradle' cerca le istruzioni' apply' prima ancora di valutare il progetto, annullando quindi i controlli 'if'. – Sebastiano

11
  1. Definire variabile - def fl
  2. variabile di inizializzazione in voi Sapori (e/o build)

    productFlavors { 
    
          freeFlavour { 
           (...) 
           fl = "free" 
          } 
    
          paidFlavour { 
           (...) 
           fl = "paid" 
          } 
         } 
    
  3. Uso if -

    if (fl == "free") { apply plugin: something }

+5

Questo non sembra funzionare. Nel mio caso (diciamo che sto chiamando assembleFree), entrambi i blocchi vengono eseguiti in modo che il valore di fl sia il nome dell'ultimo sapore dichiarato. Altre idee? – daemontus

14

di questo codice:

if (!getGradle().getStartParameter().getTaskRequests() 
     .toString().contains("Develop")){ 
    apply plugin: 'com.google.gms.google-services' 
} 
+0

Questo codice funziona. Ma è necessario fare attenzione che la prima lettera del nome del sapore debba essere in maiuscolo –