Подтвердить что ты не робот

Gradle проекты в зависимости от артефактов, созданных в проектах сестринского дела

У меня есть эта установка Gradle с четырьмя проектами, родитель с тремя детьми, в которой встроенный Java-сервер JSON встроен в военный файл, а затем статический HTML5 'frontend', потребляющий это, встроен в застежка-молния. Оба эти "устанавливают" свои артефакты в локальное репозиторий maven.

Третий проект объединения "Слияние" зависит от этих двух артефактов, чтобы построить "объединенную" войну, просто "сжимая их вместе".

Однако, как только я это сделал и работал, как предполагалось, мне, очевидно, пришлось протестировать сценарий начальной загрузки, удалив артефакты из локального репо.

Теперь я вдруг получаю "Artifact" no.company:frontend:[email protected] "не найден".

Невозможно ли зависеть от артефактов, которые будет производиться текущей сборкой?

Edit:

На основе другой идеи (и ответа Питера, обескураживающего эту логику Maven) эта версия выглядит многообещающей, а не пересекает Maven (примечание: она работает!):

// ## From frontend build.gradle:
task zipFrontend(dependsOn: 'buildFrontend',  type: Zip) {
    from ('dist/')
}

// ## From backend build.gradle:
apply plugin: 'war'

// ## From merger build.gradle:
task mergeFrontAndBack(dependsOn: [':backend:war', 
                                   ':frontend:zipFrontend'], type: War) {
    from zipTree(project(':frontend').tasks['zipFrontend'].archivePath)
    from zipTree(project(':backend').tasks['war'].archivePath)
    destinationDir(buildDir)
}

Изменить 2:

Основываясь на комментарии Питера о том, что он не достигнет структуры проекта братьев и сестер, и его конкретных предложений, вот получившаяся часть (примечание: она работает!):

// ## From frontend build.gradle:
task zipFrontend(dependsOn: 'buildFrontend',  type: Zip) {
    from ('dist/')
}
configurations { zip }
artifacts { zip zipFrontend }

// ## From backend build.gradle:
apply plugin: 'war'
configurations { jsonOnlyWar }
artifacts { jsonOnlyWar war }

// ## From merger build.gradle:
configurations { merge }
dependencies {
    merge project(path: ':backend', configuration: 'jsonOnlyWar')
    merge project(path: ':frontend', configuration: 'zip')
}
task mergeFrontAndBack(dependsOn: configurations.merge, type: War) {
    from { configurations.merge.collect { zipTree(it) } }
    destinationDir(buildDir)
}
4b9b3361

Ответ 1

Локальный репозиторий Maven (и Gradle install) должен использоваться только при обмене артефактами с сборками Maven. Он не предназначен для обмена артефактами между проектами сборки Gradle, а установка в локальный репозиторий Maven не произойдет автоматически.

Вместо этого merger необходимо объявить зависимости проекта от двух других проектов. Например:

configurations {
     merge
}

dependencies {
    merge project(":frontend"), project(":backend")
}

task merge(type: Zip) {
    from { configurations.merge.collect { zipTree(it) } }
}

Это предполагает, что frontend и backend правильно объявляют свои артефакты. (Это может произойти автоматически, например, если используется плагин war.)

Об этом вы найдете в Gradle Руководстве пользователя, в частности в главе о многопроектных сборках.