EDIT: После создания небольшого примера проекта, воспроизводящего такое поведение, кажется, что это происходит только тогда, когда существующий демон Gradle присутствует. Запуск gradle --stop сначала, а затем сборка, похоже, правильно обеспечивает порядок сначала включенной сборки, а затем основной сборки. Флаг --no-build-cache не меняет поведение. ОДНАКО Я не могу быть уверен, является ли это просто проблемой параллелизма (времена меняются, когда появляются новые демоны) или логической проблемой.
У меня есть Gradle составная сборка с использованием includeBuild в файле settings.gradle.
Код: Выделить всё
#settings.gradle
rootProject.name = mainProj
includedBuild('library')
Однако у меня есть сценарий, в котором результирующий артефакт библиотеки должен быть отредактирован в случае сборки выпуска (которую я запускаю с помощью свойства gradle -PreleaseBuild=true build). В библиотеке у меня есть следующая задача:
Код: Выделить всё
#library
task editJar {
dependsOn jar
onlyIf {project.hasProperty('releaseBuild')}
outputs.file file(jar.archiveFile)
doLast {
// open jar, do stuff, save it
}
}
compileJava.finalizedBy editJar
Я следовал управлению зависимостями с учетом вариантов gradle и правильно создал собственную конфигурацию
Код: Выделить всё
#library
configurations {
editableJar {
extendsFrom apiElements, runtimeElements
canBeConsumed = true
attributes {
//...
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, 'edited-jar'))
}
}
}
artifacts {
editableJar(editJar.outputs.files.singleFile) {
builtBy(editJar)
}
}
Код: Выделить всё
#mainProj
abstract class EditedJarsRule implements AttributeCompatibilityRule {
@Override
void execute(CompatibilityCheckDetails details) {
if (details.consumerValue.name == 'edited-jar' && details.producerValue.name == 'jar') {
details.compatible()
}
}
}
dependencies {
attributesSchema {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE) {
compatibilityRules.add(EditedJarsRule)
}
}
implementation 'org.libs:library'
}
Код: Выделить всё
# mainProj
if(project.hasProperty('releaseBuild')) {
compileClasspath {
attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, 'edited-jar'))
}
}
runtimeClasspath {
attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements, 'edited-jar'))
}
}
}
Я ожидаю, что это будет правильно поддерживаться даже в составных сборках, потому что Я просто полагаюсь на конфигурации и атрибуты, которые правильно решаются с помощью gradle в графе задач, не говоря уже о том, что порядок задач работает нормально, когда нет в релизной сборке (т. е. gradle поддерживает упорядочивание во включенных сборках).
Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-finish
Мобильная версия