2012-10-02 24 views
5

Mam zadanie, które generuje źródła java i zestaw słoików z tych źródeł (na przykład projekt a). Chciałbym wyeksportować te słoiki do zależnych projektów (np. Projekt b). Tak oto z grubsza to, co mam teraz:Gradle - czy mogę dołączyć dane wyjściowe zadania do zależności projektu

//a.gradle 

configurations{ 
    generatedJars 
} 

task generateJars(type: JavaExec) { 
    //generate jars ... 

    outputs.files += //append generated jars here 
} 

dependencies{ 
    generatedJars generateJars.outputs.files 
} 


//b.gradle 

dependencies{ 
    project(path: ':a', configuration: 'generatedJars') 
} 

Działa OK, z wyjątkiem, że dodanie generateJars.outputs.files jako zależność nie Gradle powiedzieć, że ma uruchomić generateJars zadanie, gdy nie ma jeszcze słoików generowane. Próbowałem dodać samo zadanie jako zależność, mając nadzieję, że będzie działało w taki sam sposób jak podczas dodawania zadania jar/zip do konfiguracji artefaktów (np. artifacts{ myJarTask }), ale generuje błąd informujący mnie, że nie mogę tego zrobić że. Oczywiście mogę wstrzyknąć zadanie generateJars gdzieś w procesie kompilacji, zanim :b zacznie oceniać, ale to jest niezgrabne i kruche, więc chciałbym tego uniknąć.

Czuję, że powinienem dodawać wygenerowane słoiki do artifacts{ ... } projektu, ale nie jestem pewien, jak zrobić je wtedy widoczne dla zależnych projektów. Czy istnieje lepszy sposób osiągnięcia tego?

Projekty zależne (projekt b) będą musiały wykonać konfigurację ścieżki klasy modułu IntelliJ IDEA, aby wskazywały na wygenerowane słoje projektu a. Coś raczej tak (pseudo-kod):

//b.gradle 

idea{ 
    module{ 
    scopes.COMPILE.plus += project(path: ':a', configuration: 'generatedJars').files 
    } 
} 

Do tej pory próbowałem po prostu dodanie dependecy projektu na :a „s generatedJars w :b, ale plugin Idea prostu dodaje moduł :a jako moduł-uzależnienia i zakłada, że eksportuje wygenerowane słoiki (co jest prawdopodobnie poprawnym założeniem), dlatego nie dodaje wygenerowanych słoików do ścieżki klasy :b.

Każda pomoc będzie bardzo ceniona!

Odpowiedz

2

Po pierwsze, czy potrzebujesz osobnej konfiguracji? Oznacza to, że masz klientów a, który powinien nie zobaczyć wygenerowane Jars? Jeśli nie, możesz dodać wygenerowane słoiki do konfiguracji archives, co uprości rzeczy.

drugie, poprawny sposób dodawania wygenerowanych Słoiki z konfiguracją jest (zamiast bloku dependencies):

artifacts { 
    generatedJars generateJars 
} 

Należy upewnić się, że zadanie generateJars zostanie uruchomiony automatycznie, gdy są potrzebne.

Po trzecie, pomijam += po outputs.files, chociaż może to nie mieć znaczenia. Powinieneś także dodać niezbędne dane wejściowe.

Po czwarte, dlaczego potrzebne jest zadanie JavaExec do generowania słoików? Czy możesz zamiast tego dodać wygenerowane źródła do jakiegoś zestawu źródłowego i pozwolić Gradle je zbudować?

Po piąte, IDEA nie ma koncepcji odpowiadającej zależnościom konfiguracyjnym projektu Gradle. Albo moduł IDEA w pełni zależy od innego modułu, albo wcale. Masz dwie opcje: albo użyj zależności modułu i spraw, aby wygenerowane źródła były folderem źródłowym modułu zależnego (najlepiej zarówno w kompilacji Gradle, jak i IDEA) lub przekazuj wygenerowane Jars jako zewnętrzne zależności do IDEA.W obu przypadkach powinieneś prawdopodobnie dodać zależność zadania od ideaModule do odpowiedniego zadania generowania. Jeśli to nadal nie prowadzi do satysfakcjonującej konfiguracji IDEA, możesz pomyśleć o przeniesieniu generacji słoików do osobnego podprojektu.

+0

Dzięki. Dodanie zadania do 'artefaktów 'ładnie się wyświetla w module, ale nie widzę, jak mogę odwołać się do tych słoików z projektu' b' (bez ich publikowania). Tak, możliwe jest generowanie tylko źródeł i eksportowanie ich jako źródła modułu. To powinno zadziałać, ale tworzy dodatkową pracę dla IDEA, więc miałem nadzieję, że uda się ją jakoś obejść. Aby sprawić, żeby zaimek "ideaModule -> generateJars" działał dobrze, muszę dodać także "b: ideaModule -> a: ideaModule", a mam około 3 modułów, które wszystkie muszą to zrobić. Miałem nadzieję, że uda mi się jakoś go ustawić do automatycznego rozwiązania. – rodion

+0

ad 1. 'projekt (ścieżka:" a ", konfiguracja:" wygenerowane Jars ")' –

+0

ad 2. Czy "dodatkowa praca" ma znaczenie? (Możesz użyć tego samego argumentu dla nieprodukowanego kodu.) W każdym razie powinieneś prawdopodobnie skompilować pliki za pomocą Gradle zamiast zadania JavaExec. –

Powiązane problemy