Jak mogę zaimportować jeden skrypt Gradle do innego?

99

Mam złożony skrypt Gradle, który zawiera mnóstwo funkcji związanych z budowaniem i wdrażaniem wielu projektów netbeans w wielu środowiskach.

Skrypt działa bardzo dobrze, ale w zasadzie wszystko jest konfigurowane za pomocą pół tuzina map zawierających informacje o projekcie i środowisku.

Chcę przenieść zadania do innego pliku, aby po prostu zdefiniować mapy w prostym pliku kompilacji i zaimportować zadania z innego pliku. W ten sposób mogę używać tych samych podstawowych zadań dla wielu projektów i konfigurować te projekty za pomocą prostego zestawu map.

Czy ktoś może mi powiedzieć, jak mogę zaimportować jeden plik gradle do innego, podobnie jak zadanie Anta? Jak dotąd bezskutecznie przeszukałem dokumenty Gradle'a.

Dodatkowe informacje

Po poniższej odpowiedzi Toma, pomyślałem, że spróbuję dokładnie wyjaśnić, co mam na myśli.

Zasadniczo mam skrypt gradle, który uruchamia wiele podprojektów. Jednak wszystkie podprojekty są projektami Netbeans i mają własne skrypty budowania mrówek, więc mam zadania w gradle, aby wywołać każdy z nich.

Mój problem polega na tym, że na górze pliku mam konfigurację, taką jak:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Następnie generuję zadania takie jak:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

Mam wiele takich fragmentów generowania zadań, a wszystkie z nich są ogólne - całkowicie zależą od konfiguracji na liście projektów.

Chcę więc umieścić to w osobnym skrypcie i zaimportować w następujący sposób:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

W tym przykładzie tasks.gradle będzie zawierał cały ogólny kod generowania zadań i zostanie uruchomiony dla projektów zdefiniowanych w głównym pliku build.gradle. W ten sposób tasks.gradle jest plikiem, który może być używany we wszystkich dużych projektach, które składają się z wielu podprojektów z plikami kompilacji Netbeans i.

Anthony Roy
źródło
3
Rozważ konstrukcję „zastosuj z: 'other.gradle'” do importowania deklaracji zewnętrznych. (Zobacz „12.4. Konfigurowanie projektu przy użyciu zewnętrznego skryptu kompilacji” tutaj gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh
@PetrGladkikh apply fromnatychmiast wykonuje zadania zewnętrzne. Może to nie być preferowane w logice wykonywania (tj. Chciałbym wykonywać zadania, kiedy chcę, a nie od razu).
Igor Ganapolsky
To stwierdzenie w powyższym komentarzu nie jest prawdziwe : apply fromnatychmiast wykonuje zadania zewnętrzne. Nie daj się zwieść. Zadania zewnętrzne są konfigurowane, a nie wykonywane.
Jarekczek

Odpowiedzi:

17

Odpowiedź na pytanie znalazła się w systemie Wtyczki, gdzie można dodać żądaną funkcjonalność w zestawie wtyczek, którymi mogą być pliki groovy znajdujące się w katalogu buildSrc/src/main/groovy. Wtyczki mogą być również dołączane jako Jar, chociaż nie próbowałem tego.

Szczegóły tutaj: Niestandardowe wtyczki

Anthony Roy
źródło
Tylko po to, żebyś wiedział, że link jest uszkodzony - oto aktualizacja gradle.org/docs/current/userguide/ ...
JARC,
4

Cóż, trudno jest powiedzieć, co działa najlepiej, nie widząc pliku kompilacji.

Mogę założyć, że stworzenie środowiska jako kompilacji z wieloma projektami powinno zapewnić abstrakcję, której szukasz.

W katalogu głównym projektu build.gradledefiniujesz wszystkie elementy specyficzne dla domeny, a także te, które mają zastosowanie do wszystkich podprojektów:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Katalog główny projektu może również zawierać gradle.propertiesplik, w którym definiujesz właściwości używane w projektach:

buildDirName=staging
repo.dest.dir=/var/repo
...

Następnie w dodatkowym pliku z katalogu głównego projektu o nazwie settings.gradlefaktycznie wskazujesz na swoje podprojekty:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Każdy katalog podprojektu zawiera build.gradleplik zawierający tylko elementy specyficzne dla podprojektu.

Bez względu na to, czy gradlewywołasz z katalogu głównego, czy podprojektu, gradle automatycznie uwzględni wszystkie definicje zapisane w różnych plikach.

Zauważ również, że żadne zadanie kompilacji nie zostanie wykonane dla katalogu głównego twojego projektu, o ile nie załadujesz żadnej wtyczki poza domyślną wtyczką na poziomie głównym.

Tomek
źródło
1
Dziękuję za poświęcenie czasu na odpowiedź. To nie podprojekty, z którymi mam problem, ale raczej tworzenie „biblioteki” typowych zadań. Zmodyfikowałem moje oryginalne pytanie, dodając więcej informacji i fragmentów kodu, aby wszystko było jaśniejsze.
Anthony Roy,
1
Dlatego zamiast importować („tasks.gradle”) z próbki, można by uzyskać sekcję podprojektów {} określającą ogólny kod do generowania zadań używany przez wszystkie podprojekty. Powinno to zapewnić tę samą abstrakcję, której szukasz !?
Tom
Czy wtyczka Ivy jest tutaj naprawdę potrzebna? Czy Gradle nie może być używany samodzielnie?
Igor Ganapolsky