Създаване на задача за копиране на пост компилация с Gradle

Боря се с жизнения цикъл на изграждане на Gradle; по-специално с разделянето между фазите configuration и execution. Прочетох редица раздели в ръководството на Gradle и видях редица идеи онлайн, но не намерих решение на следния проблем:

Искам да изпълня конкретна задача, за да създам артефакт в края на моята java-library-distribution компилация, който е сплескана версия на runtime конфигурационните буркани. Тоест искам да създам артефакта само когато стартирам конкретната задача за създаване на артефакта.

Създадох следната задача:

task packageSamplerTask(type: Tar, dependsOn: distTar) {
    description "Packages the build jars including dependencies as a flattened tar file. Artifact: ${distsDir}/${archivesBaseName}-${version}.tar"
    from tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files
    classifier = 'dist'
    into "${distsDir}/${archivesBaseName}-dist-${version}.tar"
}

Въпреки че тази задача създава необходимия артефакт, задачата се изпълнява по време на configuration фазата на gradle. Това поведение има следните последствия:

  • Независимо коя задача стартирам от командния ред, тази packageSamplerTask задача винаги се изпълнява, често ненужно; и
  • Ако clean проекта, компилацията се проваля при следващото изпълнение, защото $distsDir не съществува по време на configuration фазата (очевидно).

Изглежда, че ако разширя задачата Copy по този начин, винаги ще получавам този вид преждевременно поведение.

Има ли начин да използвам << closure / doLast декларациите, за да получа това, което искам? Или има нещо друго, което пропускам/трябва да направя?

Актуализация

След допълнителна работа изясних изискванията си и разреших въпроса си, както следва (конкретно):

"Искам да пакетирам моя код и зависимостите на моя код като плосък архив от буркани, които могат да бъдат внедрени като jMeter плъгин. След това пакетът може да бъде инсталиран чрез разопаковане в директорията jMeter lib/ext, както е. Пакетът, следователно , не трябва да включва бурканите jMeter (и техните зависимости), които се използват за изграждане и тестване"

Тъй като изглежда Gradle не поддържа подобното на Maven provided управление на зависимостите, създадох нова конфигурация за моя пакет, която изключва бурканите jMeter.

configurations {
    jmpackage {
        extendsFrom runtime
        exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_core', version: '2.11'
        exclude group: 'org.apache.jmeter', name: 'ApacheJMeter_java', version: '2.11'
    }
}

И след това създаде следната задача (използвайки препоръката за затваряне от Peter Niederwieser):

task packageSamplerTask(type: Tar, dependsOn: assemble) {
    from { libsDir }
    from { configurations.jmpackage.getAsFileTree() }
    classifier = 'dist'
}

Това решение изглежда работи и ми позволява да използвам само плъгинаGradle java.


person s5b    schedule 10.08.2014    source източник
comment
Откъде идва distsDir?   -  person Opal    schedule 10.08.2014
comment
@Opal Благодаря за проявения интерес. Променливата distsDir е зададена като част от Java Plugin. Ще го намерите споменат в документацията на Gradle тук.   -  person s5b    schedule 11.08.2014


Отговори (2)


Декларацията на задачата е наред, но изравняването също трябва да бъде отложено:

...
from { tarTree("${distsDir}/${archivesBaseName}-${version}.tar").files }

Освен това файлът Tar трябва да се използва по по-абстрактен начин. Например:

from { tarTree(distTar.archivePath).files }  
person Peter Niederwieser    schedule 10.08.2014

Първо, вашата задача не се изпълнява в configuration phase, но като ВСЯКА задача е конфигурирана в тази фаза. И вашето затваряне е просто конфигурация на вашата задача (затваряне на конфигурация, а не затваряне на действие). Ето защо вашият код се „изпълнява“ във фазата на конфигуриране“.

Ако искате вашият код да се изпълнява в execution phase, трябва да го напишете в doLastclosure или doFirst. Но във вашия случай е по-добре да го запазите в конфигурационно затваряне, защото вие конфигурирате задачата си.

За да сте сигурни, че вашата компилация няма да се провали поради липсващата папка, можете да я създадете с distsDir.mkdirs().

person The End    schedule 11.08.2014
comment
Благодаря за вашия отговор. Съжалявам, не бях ясен във въпроса си. Задачата се използва за преопаковане на runtime артефактите от компилацията, включително моя собствен код. Простото извършване на distsDir може да предотврати неуспеха на задачата, но задачата все пак ще бъде изпълнена всеки път, когато се извика цел на задача. Искам да извикам тази задача само когато я поискам или като зависимост от друга задача, която поискам. В зависимост от размера на артефакта на компилация, тази задача може да има забележимо въздействие върху изминалото време на компилацията, когато тази задача се изпълнява всеки път. - person s5b; 12.08.2014