2013-05-04 17 views
7

Chciałbym utworzyć nowe zadanie w moim projekcie, które tworzy archiwum słoików z plikami klas mojego projektu i plikami klas zależności (zwane także "zacienionym słojem" lub "tłustym słojem").Gradle: "klon" oryginalne zadanie jar, aby utworzyć nowe zadanie dla słoika, w tym zależności

Proponowana przez kucharskiej Gradle rozwiązanie modyfikuje standardowe zadanie słoik z JavaPlugin:

jar { 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Jednak chciałbym zachować oryginalne ło jar jak to jest i mają dodatkowe zadanie dla shaeded słoiku , czyli zadania, które zachowuje się dokładnie tak samo jak zadanie słoik, ale zawiera dodatkowe pliki według

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 

i ma innego klasyfikatora („cieniowane”).

Próbowałem przejąć konfiguracji zadania jar kopiując właściwości tak:

task shadedJar(type: Jar, dependsOn: configurations.compile) { 
    dependencies = tasks.jar.taskDependencies 
    source = tasks.jar.source 
    manifest = tasks.jar.manifest 
    includes = tasks.jar.includes 
    classifier = 'shaded' 

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

ale wynikowe zadania nie przejmie zależności od „jar” i uzyskaną słoik nie obejmuje pliki klas projektu. Dodatkowo podejście to wydaje się uciążliwe, aby być zalecanym sposobem wykorzystania istniejącego zadania jako szablonu dla nowego.

Jakie jest zalecane podejście do mojej konkretnej potrzeby (oddzielne zadanie cieniowaneJar) i do "klonowania" zadań, aby wykorzystać je jako szablony do ogólnych zadań dodatkowych?

(jestem obecnie wciąż na Gradle 1.3, ale rozwiązania dla obecnej wersji Gradle są również mile widziane)

Odpowiedz

8

Nie ma wbudowany w sposób sklonować zadań. Jednak łatwo jest skonfigurować zadanie fatJar zawierać te same pliki jak java pluginu jar zadania:

task fatJar(type: Jar) { 
    appendix = "fat" 
    from sourceSets.main.output // that's it 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Zadanie autowiring automatycznie ustanawia niezbędne zależności zadanie.

Jeśli skrypt build idzie dostosować zadanie jar można zastosować dostosowania do obu zadań jednocześnie:

configure([jar, fatJar]) { 
    version = "2.0" 
    entryCompression = "STORED" 
} 

przypadku, w przeciwieństwie do sprawy jar zadania należy jesteś definiując „szablon” siebie można "utworzyć instancję" przy użyciu metody fabrycznej:

def getMeAnotherOne(String name) { 
    task(name, type: Jar) { 
     version = "2.0" 
     entryCompression = "STORED" 
    } 
} 

getMeAnotherOne("jar1") 
getMeAnotherOne("jar2") 
Powiązane problemy