28

Mam wielozadaniowy, oparty na wielu buildach projekt na Androida i chcę zintegrować wtyczkę NewRelic. Ale muszę go stosować tylko dla jednego z klientów, a więc tylko dla jednego smaku produktu.
NewRelic używa oprzyrządowania, a wtyczka generowałaby kod w innych smakach, jeśli zastosowałem tam wtyczkę, a to nie jest dozwolone dla nas.Jak zastosować wtyczkę tylko do jednego smaku w gradle?

Moje pytanie brzmi: w jaki sposób mogę użyć polecenia apply plugin: something w pliku gradle do zastosowania tylko do jednego z moich smaków?

Odpowiedz

4

Znalazłem rozwiązanie, ale do tej pory nie jest ono najlepsze. Więc nie jestem już pewien, że to, co chciałem zrobić na początku, jest możliwe. Ocena pliku gradle i wybór odpowiedniego smaku i typu kompilacji jest w różnych fazach kompilacji gradle, więc to, co zrobiłem:

Używam parametru budowania z wiersza poleceń. Kiedy ten czynnik jest prawdziwy, stosuję wtyczkę, nawet jeśli jej tam nie ma, również ją stosuję (dla kompilacji IDE). Używam Jenkinsa, więc mógłbym napisać ten parametr w zadaniu kompilacji.

plik 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") 
    } 
} 

I trzeba uruchomić Gradle zbudowany przez to:

assembleYourApp -PcompileNewRelic=true 
+0

To nie działa dla mnie na dzień dzisiejszy. Wygląda na to, że parser 'build.gradle' szuka instrukcji' apply' zanim jeszcze oceni projekt, tym samym unieważniając sprawdzenia "if". – Sebastiano

11
  1. Zdefiniuj zmienną - def fl
  2. zmienną Initialize w was Flavors (i/lub kompilacje)

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

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

+5

To nie działa. W moim przypadku (powiedzmy, że wywołuję assembleFree), oba bloki są wykonywane, więc wartość fl jest nazwą ostatniego deklarowanego smaku. Jakieś inne pomysły? – daemontus

14

użyć tego kodu:

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

Ten kod działa. Ale musisz zwrócić uwagę, że pierwsza litera nazwy smaku powinna być wielkimi literami –

Powiązane problemy