2012-05-11 47 views
14

mającą wyciąg z https://github.com/gradle/gradle/blob/master/build.gradle:konfiguracja klienta warunkowy dla projektu Gradle

ext { 
    isDevBuild = { 
    gradle.taskGraph.hasTask(developerBuild) 
    } 
} 

task developerBuild { 
    description = 'Builds distributions and runs pre-checkin checks' 
    group = 'build' 
    dependsOn testedDists 
} 

Kiedy użyłem tego podejścia do tworzenia konfiguracji niestandardowych w moim projekcie odkryłem, że:

isDevBuild === true 

znaczy to zawsze prawdziwe, ponieważ Zadanie "developerBuild" znajduje się wewnątrz mojego projektu build.gradle, a co za tym idzie na wykresie. Mają kilka "różnych" konfiguracji (isCIBuild, isCommitBuild, isFinalReleaseBuild, ...), więc przypuszczam, że coś tu jest nie tak.

Czy ktoś może wyjaśnić, w jaki sposób ustawić te warunki warunkowe na podstawie jakiegoś zewnętrznego parametru?

Odpowiedz

35

taskGraph.hasTask() mówi, czy zadanie znajduje się w zadaniu egzekucji wykres, czyli czy zostanie wykonane. Ponieważ wykres wykonanie zadania jest tworzony jedynie po fazie konfiguracji, ta metoda musi być wywoływana z whenReady zwrotnego (lub w fazie realizacji):

gradle.taskGraph.whenReady { graph -> 
    if (graph.hasTask(developerBuild)) { 
     // do conditional configuration 
    } 
} 

Aby to bardziej czytelne, możemy wprowadzić nową metodę :

def onlyFor(task, config) { 
    gradle.taskGraph.whenReady { graph -> 
     if (graph.hasTask(task)) { 
      project.configure(project, config) 
     } 
    } 
} 

teraz możemy napisać:

onlyFor(developerBuild) { ... } 
onlyFor(ciBuild) { ... } 

Innym, prostszym sposobem rozwiązania tego problemu jest, aby sprawdzić, czy dana nazwa zadania jest zawarta w gradle.startParameter.taskNames. Ma to jednak dwa ograniczenia: po pierwsze porównuje zadania o nazwach o nazwach, które mogą mieć wpływ na kompilacje wielu projektów. Po drugie, znajdzie tylko zadania, które zostały określone bezpośrednio (np. W wierszu poleceń), ale nie ich zależności.

PS: W kodzie isDevBuild zawsze jest przechowywany, ponieważ zamknięcie (nie puste) to true zgodnie z prawdą Groovy. (W przeciwieństwie do isDevBuild(), isDevBuild nie wywoła zamknięcia.)

+0

Wracając do stwierdzenia z książki "Budowanie i testowanie z Gradle": wiedza o Groovy nie jest plus - to musi zacząć pracować z Gradle. Dzięki za pomoc. Sprawdzę to później dzisiaj. –

+1

Nie powiedziałbym, że to konieczne, aby zacząć, ale konieczne jest wdrożenie zaawansowanych rozwiązań, takich jak ten. (Prostą alternatywą, która wymaga mniej wiedzy Groovy, jest przełączanie między różnymi konfiguracjami opartymi na właściwości systemu.) Z drugiej strony znaczna część tego kodu może być napisana w stylu Java (z anonimowymi klasami wewnętrznymi i innymi) lub dosłownie w Javie, jeśli przeniósł go do wtyczki. Prawdziwym wyzwaniem w tym konkretnym przypadku jest zrozumienie strony Gradle: interfejsu API wykresu zadania, konfiguracji względem fazy wykonywania, itd. –

+0

Twoje rozwiązanie działa dobrze. Wielkie dzięki. Dla notatki, którą umieściłeś w P.S. : Nie mogę bezpośrednio wywołać 'isDevBuild()' gdy na przykład wykonuję Gradle build z 'ciBuild jar' (i nie mogę używać obu konfiguracji w tym samym czasie) - chociaż pokazałeś, że mogę wywołać zamknięcie tylko w celach edukacyjnych. –

Powiązane problemy