Gradle Composite Build дождитесь завершения includeBuildJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Gradle Composite Build дождитесь завершения includeBuild

Сообщение Anonymous »

Версия Gradle: 7.6.4
EDIT: После создания небольшого примера проекта, воспроизводящего такое поведение, кажется, что это происходит только тогда, когда существующий демон Gradle присутствует. Запуск gradle --stop сначала, а затем сборка, похоже, правильно обеспечивает порядок сначала включенной сборки, а затем основной сборки. Флаг --no-build-cache не меняет поведение. ОДНАКО Я не могу быть уверен, является ли это просто проблемой параллелизма (времена меняются, когда появляются новые демоны) или логической проблемой.
У меня есть Gradle составная сборка с использованием includeBuild в файле settings.gradle.

Код: Выделить всё

#settings.gradle
rootProject.name = mainProj

includedBuild('library')
Я собираю только Gradle на mainProj, и кажется, что он правильно собирает библиотеку сначала, а затем продолжается для сборки mainProj. Кажется, это работает нормально.
Однако у меня есть сценарий, в котором результирующий артефакт библиотеки должен быть отредактирован в случае сборки выпуска (которую я запускаю с помощью свойства 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
В этом случае при сборке mainProj происходит сбой, поскольку он пытается построить его, пока задача editJar все еще выполняется (и, следовательно, jar недоступен как зависимость).
Я следовал управлению зависимостями с учетом вариантов 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)
}
}
и правильно установили атрибутSchema с помощью правила:

Код: Выделить всё

#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'))
}
}
}
В этом случае кажется, что моя сборка mainProj не ждет, пока библиотека:editJar > задача завершена, хотя вариант запрошен правильно (я проверил информацию о зависимостях).
Я ожидаю, что это будет правильно поддерживаться даже в составных сборках, потому что Я просто полагаюсь на конфигурации и атрибуты, которые правильно решаются с помощью gradle в графе задач, не говоря уже о том, что порядок задач работает нормально, когда нет в релизной сборке (т. е. gradle поддерживает упорядочивание во включенных сборках).

Подробнее здесь: https://stackoverflow.com/questions/792 ... -to-finish
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»