2013-07-17 14 views
12

Próbuję utworzyć kompilację z wieloma projektami. Projekt główny wygląda mniej więcej tak:Podział wielu projektów programu Gradle

apply plugin: 'distribution' 
version 1.0 
distributions { 
    main { 
     baseName = 'someName' 
     contents { 
      from 'nodes' 
     into 'nodes' 
     } 
    } 
} 

Po prostu kopiuje folder z plikami do dist.

Teraz chcę, aby każdy podprojekt wprowadzał swoje rzeczy do dist. Chcę dodać każdy słoik podprojektów, wszelkie zależności i ewentualnie inne pliki itp.

Nie mam pojęcia, jak wstrzyknąć z podprojektu do katalogu głównego. Czy powinienem zrobić coś takiego? Mam na myśli coś takiego:

subprojects { 
    apply java... 
    ... 

    // pseudocode 
    jack into the root project dist plugin 
    put my produced jars and dependencies in a folder with my name 
    ... 
} 

Czy ktoś ma jakieś przykłady, czy tylko wskazuje mnie we właściwym kierunku?

dziękuję!

Odpowiedz

11

Szukałem tego samego. Z niektórymi zerkając na docs API i budować własne pliki Gradle”, doszedłem do następującego:

apply plugin: 'distribution' 

distributions { 
    main { 
     contents { 
      into('bin') { 
       from { project(':subproject1').startScripts.outputs.files } 
       from { project(':subproject2').startScripts.outputs.files } 
       fileMode = 0755 
      } 
      into('lib') { 
       def libs = [] 
       libs << project(':subproject1').configurations.runtime - project(':runner').configurations.runtime 
       libs << project(':subproject2').configurations.runtime 
       from libs 
       from project(':subproject1').jar 
       from project(':subproject2').jar 
      } 
     } 
    } 
} 

Zamknięcie contents {} jest CopySpec, wiedząc, że sprawia, że ​​korzystanie z wtyczki dystrybucji sposób prostszy :)

Sprawdź Gradle "własne podprojekty/dystrybucje/distributions.gradle dla niektórych wspaniałych przykładów użycia CopySpec.

To działa.

  • Odjęcie polega na usunięciu zduplikowanych słoików.
  • Linie ".jar" mają dodać słoik do tego projektu, ponieważ konfigurations.runtime zdaje się zawierać zależność.

Niestety, obecnie nie mam pojęcia, jak zmienić to w więcej niż dwa projekty w czysty sposób. Co najmniej jesteśmy o krok bliżej :)

5

Znalazłem rozwiązanie, które działa dobrze dla mnie. Kluczem jest to, że ty dodać oddzielny podprojekt do tworzenia dist. Ten podprojekt to sibling do pozostałych podprojektów. Oznacza to, że nie próbuj skryptować dystrybucji w pliku najwyższego poziomu build.gradle.

Nazwijmy nowy podprojekt dist. Pierwszą rzeczą, którą należy zrobić, to dodać je do najwyższego poziomu settings.gradle plik w katalogu głównym wieloma projektami:

include "subproject1", "subproject2", "subproject3", ....... , "dist" 

Twój projekt dist musi co najmniej zawierać:

  • build.gradle - należy szczegółowo poniżej
  • src/main/dist/at_least_one_dummy_file.txt - Wtyczka dystrybucyjna zawsze wymaga katalogu src/main/$distribution.name. Posiadanie niepustego z distribution.name z main sztuczki wtyczki do śledzenia wszystkich przechodnich zależności wszystkich zestawów źródłowych wszystkich projektów siostrzanych.

Następny plik build.gradle dla projektu dist:

/* Hook in all sibling project jars and their transitive dependencies */ 
apply plugin: 'java' 
dependencies { 
    compile project(':subproject1') 
    compile project(':subproject2') 
    compile project(':subproject3') 
    . . . 
} 

/* Distribution */ 
apply plugin: 'java-library-distribution' 
distributions { 
    main { 
     baseName = "your-top-level-project-name" 
     contents { 
      exclude "dist-${version}.jar" 
      . . . 
     } 
    } 
} 

Następnie uruchom gradle distZip. Plik ZIP w wersji dist/build/distributions będzie miał podkatalog lib z każdym pojedynczym JAR, którego potrzebujesz: projektem siostrzanym JAR s oraz ich przejściowymi zależnościami.

Z powodu oszustwa, którego użyliśmy, wtyczka dystrybucji zrobi pustą JAR o nazwie dist-${version}.jar. Ze względów kosmetycznych usuwam go za pomocą połączenia exclude powyżej, ale jest on nieszkodliwy. Możesz również użyć drugiego połączenia exclude, aby usunąć at_least_one_dummy_file.txt, jeśli naprawdę nie ma treści pod numerem src/main/dist, którą chcesz dołączyć. Jeśli nie chcesz dodawać żadnych artefaktów i/lub usuwać wymienionych tutaj, to w ogóle nie potrzebujesz sekcji contents.

Znalazłem także sposoby selektywnego włączania różnych artefaktów w zależności od tego, czy jest to dystrybucja "dev" czy "prod", a la Maven. Jeśli chcesz, żebym to dodał, opublikuj w komentarzach, a ja to zrobię.

3

Faktycznie sprawiłem, że działał on przez połączenie podejść z obu, pvdissel i sparc_spread.

W moim głównym projekcie utworzyłem katalog src/main/dist, w którym umieściłem dokładnie jeden plik o nazwie .gitkeep.

Plik mojego projektu głównego build.gradle wygląda następująco:

apply plugin: 'java-library-distribution' 

allprojects { 
    .... 
} 

dependencies { 
    // let root project depend on all subprojects that have the 
    // application plugin enabled 
    project.subprojects.each { p -> 
     p.plugins.withType(ApplicationPlugin) { 
      compile p 
     } 
    } 
} 

distributions { 
    main { 
     contents { 
      // exclude unnecessary files from archive 
      exclude ".gitkeep" 
      exclude "cs3d-toolbox-${version}.jar" 

      // add start scripts of all plugins that have the 
      // application plugin enabled to the archive 
      project.subprojects.each { p -> 
       p.plugins.withType(ApplicationPlugin) { 
        into('bin') { 
         from { p.startScripts.outputs.files } 
         fileMode = 0755 
        } 
       } 
      } 
     } 
    } 
} 

działa całkiem dobrze dla mnie. Testowane przy użyciu Gradle 2.0.

1

Jest to konfiguracja używam w projekcie z wielu bibliotek do tworzenia „uwolnienie” Archive:

apply plugin: 'distribution' 

distributions { 
    main { 
    baseName = libVersion 
    contents { 
     project.subprojects.each { sub -> 
     into('lib') { 
      from sub.jar 
     } 
     into('src') { 
      from sub.sourcesJar 
     } 
     into('doc') { 
      from sub.javadocJar 
     } 
     } 
    } 
    } 
} 

Korzystanie distZip zadanie tworzy archiwum ze wszystkich bibliotek z plikami rozdzielonych na trzy foldery (lib zawiera rzeczywiste słoiki, src zawiera słoiki ze źródłami i doc zawiera - zgadłeś - słoiki Javadoc).

+0

Nie mogłem wykonać tej pracy z Gradle 3.3. –

Powiązane problemy