EDIT: После создания небольшого примера проекта, воспроизводящего это поведение, кажется, что проблема связана с AttributeCompatibilityRule< /код>. Поскольку мы рассматриваем "jar"=="edited-jar", кажется, что Gradle переходит непосредственно к задаче jar и ее артефакту и не заботится о создании отредактированного jar. После удаления правила задача editJar правильно входит в граф выполнения, однако теперь ее невозможно скомпилировать, поскольку не все библиотеки генерируют варианты EditJar. Это намеренное поведение? Я ожидаю, что gradle проверит все варианты и отдаст приоритет запрошенному варианту и только если он не существует, откатится к совместимому варианту.
Я иметь составную сборку 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
Мобильная версия