Боря се с жизнения цикъл на изграждане на 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
.
distsDir
? - person Opal   schedule 10.08.2014distsDir
е зададена като част от Java Plugin. Ще го намерите споменат в документацията на Gradle тук. - person s5b   schedule 11.08.2014